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: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to