Author: norman
Date: Fri Oct 9 12:08:23 2009
New Revision: 823521
URL: http://svn.apache.org/viewvc?rev=823521&view=rev
Log:
Having a seperate Presenter/View for the IMAPFoldersTree doesn't make to much
sense after re-thinking on it
Removed:
james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPFolderPresenter.java
james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPFolderView.java
Modified:
james/hupa/trunk/client/src/main/java/org/apache/hupa/client/gin/HupaClientModule.java
james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/MainPresenter.java
james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/MainView.java
Modified:
james/hupa/trunk/client/src/main/java/org/apache/hupa/client/gin/HupaClientModule.java
URL:
http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/gin/HupaClientModule.java?rev=823521&r1=823520&r2=823521&view=diff
==============================================================================
---
james/hupa/trunk/client/src/main/java/org/apache/hupa/client/gin/HupaClientModule.java
(original)
+++
james/hupa/trunk/client/src/main/java/org/apache/hupa/client/gin/HupaClientModule.java
Fri Oct 9 12:08:23 2009
@@ -28,8 +28,6 @@
import org.apache.hupa.client.dnd.PagingScrollTableRowDragController;
import org.apache.hupa.client.mvp.AppPresenter;
import org.apache.hupa.client.mvp.AppView;
-import org.apache.hupa.client.mvp.IMAPFolderPresenter;
-import org.apache.hupa.client.mvp.IMAPFolderView;
import org.apache.hupa.client.mvp.IMAPMessageListPresenter;
import org.apache.hupa.client.mvp.IMAPMessageListView;
import org.apache.hupa.client.mvp.IMAPMessagePresenter;
@@ -54,7 +52,6 @@
bindPresenter(IMAPMessagePresenter.class,IMAPMessagePresenter.Display.class,IMAPMessageView.class);
bindPresenter(MainPresenter.class,MainPresenter.Display.class,MainView.class);
bindPresenter(MessageSendPresenter.class,
MessageSendPresenter.Display.class, MessageSendView.class);
- bindPresenter(IMAPFolderPresenter.class,
IMAPFolderPresenter.Display.class, IMAPFolderView.class);
bindPresenter(AppPresenter.class, AppPresenter.Display.class,
AppView.class);
bind(CachingDispatchAsync.class);
bind(PagingScrollTableRowDragController.class).in(Singleton.class);
Modified:
james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/MainPresenter.java
URL:
http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/MainPresenter.java?rev=823521&r1=823520&r2=823521&view=diff
==============================================================================
---
james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/MainPresenter.java
(original)
+++
james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/MainPresenter.java
Fri Oct 9 12:08:23 2009
@@ -20,6 +20,9 @@
package org.apache.hupa.client.mvp;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
import net.customware.gwt.presenter.client.DisplayCallback;
import net.customware.gwt.presenter.client.EventBus;
@@ -31,6 +34,8 @@
import org.apache.hupa.client.CachingDispatchAsync;
import org.apache.hupa.client.SessionAsyncCallback;
import org.apache.hupa.client.mvp.MessageSendPresenter.Type;
+import org.apache.hupa.client.widgets.HasDialog;
+import org.apache.hupa.client.widgets.IMAPTreeItem;
import org.apache.hupa.shared.data.IMAPFolder;
import org.apache.hupa.shared.data.Message;
import org.apache.hupa.shared.data.MessageDetails;
@@ -39,12 +44,15 @@
import org.apache.hupa.shared.events.BackEvent;
import org.apache.hupa.shared.events.BackEventHandler;
import org.apache.hupa.shared.events.DecreaseUnseenEvent;
+import org.apache.hupa.shared.events.DecreaseUnseenEventHandler;
import org.apache.hupa.shared.events.ExpandMessageEvent;
import org.apache.hupa.shared.events.ExpandMessageEventHandler;
import org.apache.hupa.shared.events.FolderSelectionEvent;
import org.apache.hupa.shared.events.FolderSelectionEventHandler;
import org.apache.hupa.shared.events.ForwardMessageEvent;
import org.apache.hupa.shared.events.ForwardMessageEventHandler;
+import org.apache.hupa.shared.events.IncreaseUnseenEvent;
+import org.apache.hupa.shared.events.IncreaseUnseenEventHandler;
import org.apache.hupa.shared.events.LoadMessagesEvent;
import org.apache.hupa.shared.events.LoadMessagesEventHandler;
import org.apache.hupa.shared.events.MessagesReceivedEvent;
@@ -55,14 +63,29 @@
import org.apache.hupa.shared.events.ReplyMessageEventHandler;
import org.apache.hupa.shared.events.SentMessageEvent;
import org.apache.hupa.shared.events.SentMessageEventHandler;
+import org.apache.hupa.shared.rpc.CreateFolder;
+import org.apache.hupa.shared.rpc.DeleteFolder;
+import org.apache.hupa.shared.rpc.EmptyResult;
+import org.apache.hupa.shared.rpc.FetchFolders;
+import org.apache.hupa.shared.rpc.FetchFoldersResult;
import org.apache.hupa.shared.rpc.GetMessageDetails;
import org.apache.hupa.shared.rpc.GetMessageDetailsResult;
+import org.apache.hupa.shared.rpc.RenameFolder;
+import org.apache.hupa.widgets.event.EditEvent;
+import org.apache.hupa.widgets.event.EditHandler;
+import org.apache.hupa.widgets.ui.HasEditable;
+import org.apache.hupa.widgets.ui.HasEnable;
import com.google.gwt.core.client.GWT;
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.logical.shared.HasSelectionHandlers;
+import com.google.gwt.event.logical.shared.SelectionEvent;
+import com.google.gwt.event.logical.shared.SelectionHandler;
+import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.HasValue;
+import com.google.gwt.user.client.ui.TreeItem;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
@@ -74,7 +97,21 @@
public HasValue<String> getSearchValue();
public void fillOracle(ArrayList<Message> messages);
public void setCenter(Widget widget);
- public void setWest(Widget widget);
+ public HasSelectionHandlers<TreeItem> getTree();
+ public void bindTreeItems(List<IMAPTreeItem> treeList);
+ public HasClickHandlers getRenameClick();
+ public HasClickHandlers getDeleteClick();
+ public HasClickHandlers getNewClick();
+ public HasDialog getDeleteConfirmDialog();
+ public HasClickHandlers getDeleteConfirmClick();
+ public HasEnable getRenameEnable();
+ public HasEnable getDeleteEnable();
+ public HasEnable getNewEnable();
+ public void updateTreeItem(IMAPFolder folder);
+ public void deleteSelectedFolder();
+ public HasEditable createFolder(EditHandler handler);
+ public void increaseUnseenMessageCount(IMAPFolder folder, int amount);
+ public void decreaseUnseenMessageCount(IMAPFolder folder, int amount);
}
private CachingDispatchAsync cachingDispatcher;
@@ -84,20 +121,108 @@
private IMAPMessageListPresenter messageListPresenter;
private IMAPMessagePresenter messagePresenter;
private MessageSendPresenter sendPresenter;
- private IMAPFolderPresenter folderPresenter;
+ private IMAPTreeItem tItem;
+ private HasEditable editableTreeItem;
public static final Place PLACE = new Place("Main");
@Inject
- public MainPresenter(MainPresenter.Display display, EventBus bus,
CachingDispatchAsync cachingDispatcher,IMAPFolderPresenter folderPresenter,
IMAPMessageListPresenter messageListPresenter, IMAPMessagePresenter
messagePresenter, MessageSendPresenter sendPresenter) {
+ public MainPresenter(MainPresenter.Display display, EventBus bus,
CachingDispatchAsync cachingDispatcher, IMAPMessageListPresenter
messageListPresenter, IMAPMessagePresenter messagePresenter,
MessageSendPresenter sendPresenter) {
super(display,bus);
this.cachingDispatcher = cachingDispatcher;
this.messageListPresenter = messageListPresenter;
this.messagePresenter = messagePresenter;
this.sendPresenter = sendPresenter;
- this.folderPresenter = folderPresenter;
}
+ protected void loadTreeItems() {
+ cachingDispatcher.execute(new FetchFolders(), new
SessionAsyncCallback<FetchFoldersResult>(new
DisplayCallback<FetchFoldersResult>(display) {
+
+ @Override
+ protected void handleFailure(Throwable e) {
+ GWT.log("ERROR=", e);
+ }
+
+ @Override
+ protected void handleSuccess(FetchFoldersResult result) {
+ display.bindTreeItems(createTreeNodes(result.getFolders()));
+
+ // disable
+ display.getDeleteEnable().setEnabled(false);
+ display.getRenameEnable().setEnabled(false);
+ }
+
+
+ },eventBus,user));
+ }
+
+
+ /**
+ * Create recursive the TreeNodes with all childs
+ *
+ * @param list
+ * @return
+ */
+ private List<IMAPTreeItem> createTreeNodes(List<IMAPFolder> list) {
+ List<IMAPTreeItem> tList = new ArrayList<IMAPTreeItem>();
+
+ for (int i = 0; i < list.size(); i++) {
+ IMAPFolder iFolder = list.get(i);
+
+ final IMAPTreeItem record = new IMAPTreeItem(iFolder);
+ record.addEditHandler(new EditHandler() {
+
+ public void onEditEvent(EditEvent event) {
+ if(event.getEventType().equals(EditEvent.EventType.Stop)) {
+ IMAPFolder iFolder = new
IMAPFolder((String)event.getOldValue());
+ final String newName = (String)event.getNewValue();
+ if (iFolder.getFullName().equalsIgnoreCase(newName) ==
false) {
+ cachingDispatcher.execute(new
RenameFolder(iFolder, newName), new SessionAsyncCallback<EmptyResult>(new
AsyncCallback<EmptyResult>() {
+
+ public void onFailure(Throwable caught) {
+ record.cancelEdit();
+ }
+
+ public void onSuccess(EmptyResult result) {
+ folder.setFullName(newName);
+ }
+
+ },eventBus,user));
+ }
+
+ }
+ }
+
+ });
+ record.setUserObject(iFolder);
+
+ List<IMAPFolder> childFolders = iFolder.getChildIMAPFolders();
+ if (childFolders != null && childFolders.isEmpty() == false) {
+ List<IMAPTreeItem> items = createTreeNodes(childFolders);
+ for (int a = 0; a < items.size(); a++) {
+ record.addItem(items.get(a));
+ }
+ }
+
+ // Store the INBOX as starting point after first loading
+ if
(iFolder.getFullName().equals(user.getSettings().getInboxFolderName())) {
+ folder = iFolder;
+ tItem = record;
+ }
+
+ tList.add(record);
+ }
+
+ // Sort tree
+ Collections.sort(tList, new Comparator<TreeItem>() {
+
+ public int compare(TreeItem o1, TreeItem o2) {
+ return o1.getText().compareTo(o2.getText());
+ }
+
+ });
+ return tList;
+ }
private void showMessageTable(User user, IMAPFolder folder, String
searchValue,boolean refresh) {
this.user = user;
@@ -161,12 +286,6 @@
public Place getPlace() {
return PLACE;
}
-
- private void showIMAPFolders(User user) {
- folderPresenter.bind(user);
- display.setWest(folderPresenter.getDisplay().asWidget());
-
- }
public void bind(User user) {
this.user = user;
@@ -287,6 +406,142 @@
}));
+
+ registerHandler(eventBus.addHandler(ExpandMessageEvent.TYPE, new
ExpandMessageEventHandler() {
+
+ public void onExpandMessage(ExpandMessageEvent event) {
+ if (editableTreeItem != null && editableTreeItem.isEdit()) {
+ editableTreeItem.cancelEdit();
+ }
+ }
+
+ }));
+ registerHandler(eventBus.addHandler(NewMessageEvent.TYPE, new
NewMessageEventHandler() {
+
+ public void onNewMessageEvent(NewMessageEvent event) {
+ if (editableTreeItem != null && editableTreeItem.isEdit()) {
+ editableTreeItem.cancelEdit();
+ }
+ }
+
+ }));
+ registerHandler(eventBus.addHandler(DecreaseUnseenEvent.TYPE, new
DecreaseUnseenEventHandler() {
+
+ public void onDecreaseUnseenEvent(DecreaseUnseenEvent event) {
+ // Check if the folder was the trash folder. If not increase
the message count of the trash folder
+ if
(user.getSettings().getTrashFolderName().equalsIgnoreCase(event.getFolder().getFullName())
== false) {
+ display.increaseUnseenMessageCount(new
IMAPFolder(user.getSettings().getTrashFolderName()),event.getAmount());
+ }
+
display.decreaseUnseenMessageCount(event.getFolder(),event.getAmount());
+ }
+
+ }));
+ registerHandler(eventBus.addHandler(IncreaseUnseenEvent.TYPE, new
IncreaseUnseenEventHandler() {
+
+ public void onIncreaseUnseenEvent(IncreaseUnseenEvent event) {
+
display.increaseUnseenMessageCount(event.getFolder(),event.getAmount());
+ }
+
+
+ }));
+ registerHandler(display.getTree().addSelectionHandler(new
SelectionHandler<TreeItem>() {
+
+ public void onSelection(SelectionEvent<TreeItem> event) {
+ tItem = (IMAPTreeItem)event.getSelectedItem();
+ folder = (IMAPFolder) tItem.getUserObject();
+ eventBus.fireEvent(new LoadMessagesEvent(user,folder));
+ }
+
+ }));
+
+ registerHandler(display.getTree().addSelectionHandler(new
SelectionHandler<TreeItem>() {
+
+ public void onSelection(SelectionEvent<TreeItem> event) {
+ tItem = (IMAPTreeItem)event.getSelectedItem();
+ folder = (IMAPFolder) tItem.getUserObject();
+ if
(folder.getFullName().equalsIgnoreCase(user.getSettings().getInboxFolderName()))
{
+ display.getDeleteEnable().setEnabled(false);
+ display.getRenameEnable().setEnabled(false);
+ } else {
+ display.getDeleteEnable().setEnabled(true);
+ display.getRenameEnable().setEnabled(true);
+ }
+ }
+
+ }));
+
+ registerHandler(display.getRenameClick().addClickHandler(new
ClickHandler() {
+
+ public void onClick(ClickEvent event) {
+ tItem.startEdit();
+ }
+
+ }));
+
+ registerHandler(display.getDeleteClick().addClickHandler(new
ClickHandler() {
+
+ public void onClick(ClickEvent event) {
+ display.getDeleteConfirmDialog().show();
+ }
+
+ }));
+
+ registerHandler(display.getDeleteConfirmClick().addClickHandler(new
ClickHandler() {
+
+ public void onClick(ClickEvent event) {
+ cachingDispatcher.execute(new DeleteFolder(folder), new
AsyncCallback<EmptyResult>() {
+
+ public void onFailure(Throwable caught) {
+ GWT.log("ERROR while deleting", caught);
+ }
+
+ public void onSuccess(EmptyResult result) {
+ display.deleteSelectedFolder();
+ }
+
+ });
+ }
+
+ }));
+
+ registerHandler(display.getNewClick().addClickHandler(new
ClickHandler() {
+
+ public void onClick(ClickEvent event) {
+ editableTreeItem = display.createFolder(new EditHandler() {
+
+ public void onEditEvent(EditEvent event) {
+ final IMAPTreeItem item =
(IMAPTreeItem)event.getSource();
+ final String newValue = (String) event.getNewValue();
+ if
(event.getEventType().equals(EditEvent.EventType.Stop)) {
+ cachingDispatcher.execute(new CreateFolder(new
IMAPFolder(newValue.trim())), new AsyncCallback<EmptyResult>() {
+
+ public void onFailure(Throwable caught) {
+ GWT.log("Error while create
folder",caught);
+ item.cancelEdit();
+ }
+
+ public void onSuccess(EmptyResult result) {
+ // Nothing todo
+ }
+
+ });
+ }
+ }
+
+ });
+ }
+
+ }));
+
+ registerHandler(eventBus.addHandler(MessagesReceivedEvent.TYPE, new
MessagesReceivedEventHandler() {
+
+ public void onMessagesReceived(MessagesReceivedEvent event) {
+ IMAPFolder f = event.getFolder();
+ display.updateTreeItem(f);
+ }
+
+ }));
+
}
@@ -299,13 +554,12 @@
messagePresenter.unbind();
sendPresenter.unbind();
messageListPresenter.unbind();
- folderPresenter.unbind();
reset();
}
public void refreshDisplay() {
- showIMAPFolders(user);
+ loadTreeItems();
showMessageTable(user,folder,null,true);
}
Modified:
james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/MainView.java
URL:
http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/MainView.java?rev=823521&r1=823520&r2=823521&view=diff
==============================================================================
---
james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/MainView.java
(original)
+++
james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/MainView.java
Fri Oct 9 12:08:23 2009
@@ -20,26 +20,54 @@
package org.apache.hupa.client.mvp;
import java.util.ArrayList;
+import java.util.List;
+
+import net.customware.gwt.presenter.client.EventBus;
import org.apache.hupa.client.HupaConstants;
+import org.apache.hupa.client.HupaMessages;
import org.apache.hupa.client.bundles.IMAPTreeImages;
+import org.apache.hupa.client.dnd.PagingScrollTableRowDragController;
+import org.apache.hupa.client.widgets.ConfirmDialogBox;
+import org.apache.hupa.client.widgets.HasDialog;
+import org.apache.hupa.client.widgets.IMAPTreeItem;
import org.apache.hupa.client.widgets.Loading;
+import org.apache.hupa.shared.data.IMAPFolder;
import org.apache.hupa.shared.data.Message;
+import org.apache.hupa.shared.data.User;
+import org.apache.hupa.shared.data.Message.IMAPFlag;
+import org.apache.hupa.shared.events.LoginEvent;
+import org.apache.hupa.shared.events.LoginEventHandler;
+import org.apache.hupa.shared.events.LogoutEvent;
+import org.apache.hupa.shared.events.LogoutEventHandler;
+import org.apache.hupa.shared.events.MoveMessageEvent;
+import org.apache.hupa.widgets.event.EditEvent;
+import org.apache.hupa.widgets.event.EditHandler;
+import org.apache.hupa.widgets.ui.EnableHyperlink;
+import org.apache.hupa.widgets.ui.HasEditable;
+import org.apache.hupa.widgets.ui.HasEnable;
import org.cobogw.gwt.user.client.ui.Button;
import org.cobogw.gwt.user.client.ui.RoundedPanel;
+import com.allen_sauer.gwt.dnd.client.DragContext;
+import com.allen_sauer.gwt.dnd.client.VetoDragException;
+import com.allen_sauer.gwt.dnd.client.drop.DropController;
+import com.allen_sauer.gwt.dnd.client.drop.SimpleDropController;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
+import com.google.gwt.event.logical.shared.HasSelectionHandlers;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
+import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.Tree;
+import com.google.gwt.user.client.ui.TreeItem;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
@@ -59,9 +87,24 @@
private Widget centerWidget;
private RoundedPanel center;
private IMAPMessageListView mListView;
+ private HupaMessages messages = GWT.create(HupaMessages.class);
+ private VerticalPanel folderPanel = new VerticalPanel();
+ private SimplePanel panel = new SimplePanel();
+ private HorizontalPanel folderButtonBar = new HorizontalPanel();
+ private EnableHyperlink newFolderButton = new
EnableHyperlink(constants.newFolder(), "");
+ private EnableHyperlink renameFolderButton = new
EnableHyperlink(constants.renameFolder(), "");
+ private EnableHyperlink deleteFolderButton = new
EnableHyperlink(constants.deleteFolder(), "");
+ private ConfirmDialogBox confirmFolderDeleteBox = new ConfirmDialogBox();
+ private Loading loader = new Loading(false);
+ private List<DropController> dropControllerList = new
ArrayList<DropController>();
+ private EventBus bus;
+ private PagingScrollTableRowDragController controller;
+ protected User user;
@Inject
- public MainView() {
+ public MainView(EventBus bus, PagingScrollTableRowDragController
controllerProvider) {
+ this.controller = controllerProvider;
+ this.bus = bus;
dockPanel = new DockPanel();
@@ -85,6 +128,41 @@
west = new RoundedPanel(RoundedPanel.ALL,1);
west.add(folderTree);
west.setWidth("150px");
+
+
+ folderTree.setAnimationEnabled(true);
+ folderPanel.setSpacing(5);
+
+
+ folderButtonBar.setSpacing(3);
+ folderButtonBar.add(newFolderButton);
+ folderButtonBar.add(renameFolderButton);
+ folderButtonBar.add(deleteFolderButton);
+ RoundedPanel buttonPanel = new RoundedPanel(RoundedPanel.ALL,1);
+ buttonPanel.setBorder();
+ buttonPanel.add(folderButtonBar);
+
+ folderPanel.add(buttonPanel);
+ folderPanel.add(folderTree);
+
+ panel.add(loader);
+ confirmFolderDeleteBox.setText(messages.confirmDeleteFolder());
+
+ bus.addHandler(LoginEvent.TYPE,new LoginEventHandler() {
+
+ public void onLogin(LoginEvent event) {
+ user = event.getUser();
+ }
+
+ });
+ bus.addHandler(LogoutEvent.TYPE,new LogoutEventHandler() {
+
+ public void onLogout(LogoutEvent event) {
+ user = null;
+ }
+
+ });
+ west.add(panel);
}
private void createNorth() {
@@ -159,21 +237,321 @@
centerWidget = widget;
center.setWidget(centerWidget);
}
-
- public void setWest(Widget widget) {
- west.clear();
- west.setWidget(widget);
- }
- public Widget asWidget() {
- return this;
- }
-
- public void startProcessing() {
- loading.show();
- }
-
- public void stopProcessing() {
- loading.hide();
- }
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.hupa.client.mvp.IMAPFolderPresenter.Display#bindTreeItems(java.util.List)
+ */
+ public void bindTreeItems(List<IMAPTreeItem> treeList) {
+ folderTree.clear();
+ for (int i = 0; i < dropControllerList.size();i++) {
+ controller.unregisterDropController(dropControllerList.get(i));
+ }
+
+ for (int i = 0; i < treeList.size(); i++) {
+ IMAPTreeItem item = treeList.get(i);
+ bindDropController(item);
+ folderTree.addItem(item);
+
+ if (((IMAPFolder)
item.getUserObject()).getFullName().equalsIgnoreCase(user.getSettings().getInboxFolderName()))
{
+ folderTree.setSelectedItem(item, false);
+ }
+
+ }
+ }
+
+ /**
+ * Bind a IMAPFolderDropController to the given Item and all its childs
+ *
+ * @param item
+ */
+ private void bindDropController(IMAPTreeItem item) {
+ IMAPFolderDropController dropController = new
IMAPFolderDropController(item);
+ controller.registerDropController(dropController);
+ dropControllerList.add(dropController);
+
+ if (item.getChildCount() > 0) {
+ for (int i = 0; i < item.getChildCount(); i++) {
+ bindDropController((IMAPTreeItem)item.getChild(i));
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.hupa.client.mvp.IMAPFolderPresenter.Display#getTree()
+ */
+ public HasSelectionHandlers<TreeItem> getTree() {
+ return folderTree;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see net.customware.gwt.presenter.client.widget.WidgetDisplay#asWidget()
+ */
+ public Widget asWidget() {
+ return this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see net.customware.gwt.presenter.client.Display#startProcessing()
+ */
+ public void startProcessing() {
+ loader.show();
+ panel.clear();
+ panel.add(loader);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see net.customware.gwt.presenter.client.Display#stopProcessing()
+ */
+ public void stopProcessing() {
+ panel.clear();
+ panel.add(folderPanel);
+ }
+
+ /**
+ * Drop controller which handle drop on TreeItems
+ *
+ *
+ */
+ private class IMAPFolderDropController extends SimpleDropController {
+ private IMAPTreeItem item;
+
+ public IMAPFolderDropController(IMAPTreeItem item) {
+ super(item.getWidget());
+ this.item = item;
+ }
+
+ /**
+ * Veto the Drop if the folder is the same
+ */
+ @Override
+ public void onPreviewDrop(DragContext context) throws
VetoDragException {
+ if (item.equals(folderTree.getSelectedItem())) {
+ throw new VetoDragException();
+ }
+ }
+
+ /**
+ * Set the right unseen count on the folders and fire an event
+ */
+ @Override
+ public void onDrop(DragContext context) {
+ IMAPTreeItem oldTreeItem =
(IMAPTreeItem)folderTree.getSelectedItem();
+ Message message = (Message)controller.getDragValue();
+ if (message.getFlags().contains(IMAPFlag.SEEN) == false) {
+ oldTreeItem.decreaseUnseenMessageCount();
+ item.increaseUnseenMessageCount();
+ }
+ bus.fireEvent(new
MoveMessageEvent(user,(IMAPFolder)oldTreeItem.getUserObject(),(IMAPFolder)item.getUserObject(),message));
+ }
+
+ /**
+ * Update the proxy widget to show its valid to drop it
+ *
+ */
+ @Override
+ public void onEnter(DragContext context) {
+ if (item.equals(folderTree.getSelectedItem()) == false) {
+ controller.getCurrentProxy().setIsValid(true);
+ }
+ super.onEnter(context);
+ }
+
+ /**
+ * Update the proxy widget to show its invalid to drop it
+ */
+ @Override
+ public void onLeave(DragContext context) {
+ controller.getCurrentProxy().setIsValid(false);
+ super.onLeave(context);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.hupa.client.mvp.IMAPFolderPresenter.Display#getRenameClick()
+ */
+ public HasClickHandlers getRenameClick() {
+ return renameFolderButton;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.hupa.client.mvp.IMAPFolderPresenter.Display#getDeleteEnable()
+ */
+ public HasEnable getDeleteEnable() {
+ return deleteFolderButton;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.hupa.client.mvp.IMAPFolderPresenter.Display#getNewEnable()
+ */
+ public HasEnable getNewEnable() {
+ return newFolderButton;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.hupa.client.mvp.IMAPFolderPresenter.Display#getRenameEnable()
+ */
+ public HasEnable getRenameEnable() {
+ return renameFolderButton;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.hupa.client.mvp.IMAPFolderPresenter.Display#getDeleteClick()
+ */
+ public HasClickHandlers getDeleteClick() {
+ return deleteFolderButton;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.hupa.client.mvp.IMAPFolderPresenter.Display#getNewClick()
+ */
+ public HasClickHandlers getNewClick() {
+ return newFolderButton;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.hupa.client.mvp.IMAPFolderPresenter.Display#getDeleteConfirmDialog()
+ */
+ public HasDialog getDeleteConfirmDialog() {
+ return confirmFolderDeleteBox;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.hupa.client.mvp.IMAPFolderPresenter.Display#getDeleteConfirmClick()
+ */
+ public HasClickHandlers getDeleteConfirmClick() {
+ return confirmFolderDeleteBox;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.hupa.client.mvp.IMAPFolderPresenter.Display#deleteSelectedFolder()
+ */
+ public void deleteSelectedFolder() {
+ folderTree.getSelectedItem().remove();
+
+
+ // Select the INBOX after delete folder
+ for (int i = 0; i < folderTree.getItemCount(); i++) {
+ IMAPTreeItem item = (IMAPTreeItem) folderTree.getItem(i);
+ if (((IMAPFolder)
item.getUserObject()).getFullName().equalsIgnoreCase(user.getSettings().getInboxFolderName()))
{
+ folderTree.setSelectedItem(item, true);
+ break;
+ }
+ }
+
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.hupa.client.mvp.IMAPFolderPresenter.Display#createFolder(org.apache.hupa.client.widgets.EditHandler)
+ */
+ public HasEditable createFolder(EditHandler handler) {
+ final IMAPTreeItem selected =
(IMAPTreeItem)folderTree.getSelectedItem();
+ IMAPFolder oldFolder = (IMAPFolder) selected.getUserObject();
+
+ // Generate a new folder with a whitespace as name, this is needed as
workaround
+ IMAPFolder folder = new IMAPFolder(oldFolder.getFullName() +
oldFolder.getDelimiter() +" ");
+ folder.setDelimiter(oldFolder.getDelimiter());
+
+ final IMAPTreeItem newItem = new IMAPTreeItem(folder);
+
+ // add the new item as child
+ folderTree.getSelectedItem().addItem(newItem);
+ newItem.addEditHandler(handler);
+ newItem.addEditHandler(new EditHandler() {
+
+ public void onEditEvent(EditEvent event) {
+ if (event.getEventType().equals(EditEvent.EventType.Cancel)) {
+ // remove the folder
+ newItem.remove();
+ folderTree.setSelectedItem(selected, false);
+ } else if
(event.getEventType().equals(EditEvent.EventType.Stop)) {
+ // Select the new created folder and fire an event
+ folderTree.setSelectedItem(newItem, true);
+ }
+
+ }
+
+ });
+ // Expand the parent
+ folderTree.getSelectedItem().setState(true,false);
+
+ // Select the new folder and start editing it
+ folderTree.setSelectedItem(newItem, false);
+ newItem.startEdit();
+
+ // reset the text of the new item (remove the whitespace)
+ newItem.setText("");
+
+ return newItem;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.hupa.client.mvp.IMAPFolderPresenter.Display#decreaseUnseenMessageCount(org.apache.hupa.shared.data.IMAPFolder,
int)
+ */
+ public void decreaseUnseenMessageCount(IMAPFolder folder, int amount) {
+ int count = folderTree.getItemCount();
+ for (int i = 0; i < count; i++) {
+ IMAPTreeItem item = findTreeItemForFolder((IMAPTreeItem)
folderTree.getItem(i), folder);
+ if (item != null) {
+ item.descreaseUnseenMessageCount(amount);
+ break;
+ }
+
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.hupa.client.mvp.IMAPFolderPresenter.Display#increaseUnseenMessageCount(org.apache.hupa.shared.data.IMAPFolder,
int)
+ */
+ public void increaseUnseenMessageCount(IMAPFolder folder, int amount) {
+ int count = folderTree.getItemCount();
+ for (int i = 0; i < count; i++) {
+ IMAPTreeItem item = findTreeItemForFolder((IMAPTreeItem)
folderTree.getItem(i), folder);
+ if (item != null) {
+ item.increaseUnseenMessageCount(amount);
+ break;
+ }
+
+ }
+ }
+
+ private IMAPTreeItem findTreeItemForFolder(IMAPTreeItem item, IMAPFolder
folder) {
+ if
(folder.getFullName().equalsIgnoreCase(((IMAPFolder)item.getUserObject()).getFullName()))
{
+ return item;
+ }
+ for (int i = 0; i < item.getChildCount(); i++) {
+ IMAPTreeItem tItem =
findTreeItemForFolder((IMAPTreeItem)item.getChild(i),folder);
+ if (tItem != null) {
+ return tItem;
+ }
+ }
+ return null;
+ }
+
+ public void updateTreeItem(IMAPFolder folder) {
+ int count = folderTree.getItemCount();
+ for (int i = 0; i < count; i++) {
+ IMAPTreeItem item = findTreeItemForFolder((IMAPTreeItem)
folderTree.getItem(i), folder);
+ if (item != null) {
+ item.setUserObject(folder);
+ break;
+ }
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]