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