You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by do...@apache.org on 2013/08/21 18:35:18 UTC

svn commit: r1516205 [2/9] - in /james/hupa/trunk: ./ client/src/main/java/org/apache/hupa/ client/src/main/java/org/apache/hupa/client/ client/src/main/java/org/apache/hupa/client/gin/ client/src/main/java/org/apache/hupa/client/mvp/ client/src/main/j...

Added: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessageListPresenter.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessageListPresenter.java?rev=1516205&view=auto
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessageListPresenter.java (added)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessageListPresenter.java Wed Aug 21 16:35:16 2013
@@ -0,0 +1,424 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.hupa.client.mvp;
+
+import java.util.ArrayList;
+
+import net.customware.gwt.dispatch.client.DispatchAsync;
+import net.customware.gwt.presenter.client.EventBus;
+import net.customware.gwt.presenter.client.widget.WidgetDisplay;
+import net.customware.gwt.presenter.client.widget.WidgetPresenter;
+
+import org.apache.hupa.client.HandlerRegistrationAdapter;
+import org.apache.hupa.client.HupaCallback;
+import org.apache.hupa.client.widgets.HasDialog;
+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.DecreaseUnseenEvent;
+import org.apache.hupa.shared.events.ExpandMessageEvent;
+import org.apache.hupa.shared.events.FolderSelectionEvent;
+import org.apache.hupa.shared.events.FolderSelectionEventHandler;
+import org.apache.hupa.shared.events.IncreaseUnseenEvent;
+import org.apache.hupa.shared.events.LoadMessagesEvent;
+import org.apache.hupa.shared.events.LogoutEvent;
+import org.apache.hupa.shared.events.LogoutEventHandler;
+import org.apache.hupa.shared.events.MessagesReceivedEvent;
+import org.apache.hupa.shared.events.MessagesReceivedEventHandler;
+import org.apache.hupa.shared.events.MoveMessageEvent;
+import org.apache.hupa.shared.events.MoveMessageEventHandler;
+import org.apache.hupa.shared.events.NewMessageEvent;
+import org.apache.hupa.shared.rpc.DeleteAllMessages;
+import org.apache.hupa.shared.rpc.DeleteMessageByUid;
+import org.apache.hupa.shared.rpc.DeleteMessageResult;
+import org.apache.hupa.shared.rpc.GenericResult;
+import org.apache.hupa.shared.rpc.MoveMessage;
+import org.apache.hupa.shared.rpc.MoveMessageResult;
+import org.apache.hupa.shared.rpc.SetFlag;
+import org.apache.hupa.widgets.ui.HasEnable;
+
+import com.google.gwt.event.dom.client.ChangeEvent;
+import com.google.gwt.event.dom.client.ChangeHandler;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.HasChangeHandlers;
+import com.google.gwt.event.dom.client.HasClickHandlers;
+import com.google.gwt.gen2.table.event.client.HasPageChangeHandlers;
+import com.google.gwt.gen2.table.event.client.HasPageLoadHandlers;
+import com.google.gwt.gen2.table.event.client.HasRowSelectionHandlers;
+import com.google.gwt.gen2.table.event.client.PageChangeEvent;
+import com.google.gwt.gen2.table.event.client.PageChangeHandler;
+import com.google.gwt.gen2.table.event.client.RowSelectionEvent;
+import com.google.gwt.gen2.table.event.client.RowSelectionHandler;
+import com.google.gwt.user.client.ui.HasValue;
+import com.google.gwt.user.client.ui.SourcesTableEvents;
+import com.google.gwt.user.client.ui.TableListener;
+import com.google.inject.Inject;
+
+@SuppressWarnings("deprecation")
+public class IMAPMessageListPresenter extends WidgetPresenter<IMAPMessageListPresenter.Display>{
+    
+    public interface Display extends WidgetDisplay {
+        public HasRowSelectionHandlers getDataTableSelection();
+        public HasPageLoadHandlers getDataTableLoad();
+        public void addTableListener(TableListener listener) ;
+        public void removeTableListener(TableListener listener) ;
+        public void setPostFetchMessageCount(int count);
+        public HasClickHandlers getNewClick();
+        public Message getData(int rowIndex);
+        public HasClickHandlers getDeleteClick();
+        public HasClickHandlers getDeleteAllClick();
+        public HasEnable getDeleteEnable();
+        public void reloadData();
+        public void removeMessages(ArrayList<Message> messages);
+        public ArrayList<Message> getSelectedMessages();
+        public void reset();
+        public HasDialog getConfirmDeleteDialog();
+        public HasDialog getConfirmDeleteAllDialog();
+        public HasClickHandlers getConfirmDeleteDialogClick();
+        public HasClickHandlers getConfirmDeleteAllDialogClick();
+        public void selectAllMessages();
+        public void deselectAllMessages();
+        public HasClickHandlers getSelectAllClick();
+        public HasClickHandlers getSelectNoneClick();
+        public HasClickHandlers getMarkSeenClick();
+        public HasClickHandlers getMarkUnseenClick();
+        public HasEnable getMarkSeenEnable();
+        public HasEnable getMarkUnseenEnable();
+        public HasClickHandlers getRefreshClick();
+        public void redraw();
+        public HasPageChangeHandlers getDataTablePageChange();
+        public void goToPage(int page);
+        public int getCurrentPage();
+        public int getRowsPerPageIndex();
+        public HasChangeHandlers getRowsPerPageChange();     
+        public HasClickHandlers getSearchClick();
+        public HasValue<String> getSearchValue();
+        public void fillSearchOracle(ArrayList<Message> messages);
+        public void setExpandLoading(boolean expanding);
+
+    }
+
+    private String searchValue;
+    private User user;
+    private IMAPFolder folder;
+    private DispatchAsync dispatcher;
+    private ShowMessageTableListener tableListener = new ShowMessageTableListener();
+    
+    @Inject
+    public IMAPMessageListPresenter(IMAPMessageListPresenter.Display display,EventBus bus,DispatchAsync dispatcher) {
+        super(display,bus);
+        this.dispatcher = dispatcher;
+        
+        // add this event on constructor because we don't want to remove it on unbind
+        eventBus.addHandler(LogoutEvent.TYPE, new LogoutEventHandler() {
+
+            public void onLogout(LogoutEvent logoutEvent) {
+                getDisplay().reset();
+                getDisplay().getSearchValue().setValue("");
+                
+                // we need to fire a event to notify the history about the reset
+                firePresenterChangedEvent();
+            }
+            
+        });
+    }
+
+    @Override
+    protected void onBind() {
+        registerHandler(eventBus.addHandler(MessagesReceivedEvent.TYPE, new MessagesReceivedEventHandler() {
+
+            public void onMessagesReceived(MessagesReceivedEvent event) {
+
+                // fill the oracle
+                display.fillSearchOracle(event.getMessages());
+            }
+
+        }));
+        registerHandler(display.getSearchClick().addClickHandler(new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                String searchValue = null;
+                if (display.getSearchValue().getValue().trim().length() > 0) {
+                    searchValue = display.getSearchValue().getValue().trim();
+                }
+                eventBus.fireEvent(new LoadMessagesEvent(user, folder, searchValue));
+            }
+
+        }));
+        registerHandler(eventBus.addHandler(MoveMessageEvent.TYPE, new MoveMessageEventHandler() {
+
+            public void onMoveMessageHandler(MoveMessageEvent event) {
+                final Message message = event.getMessage();
+                dispatcher.execute(new MoveMessage(event.getOldFolder(), event.getNewFolder(), message.getUid()), new HupaCallback<MoveMessageResult>(dispatcher, eventBus) {
+                    public void callback(MoveMessageResult result) {
+                        ArrayList<Message> messageArray = new ArrayList<Message>();
+                        messageArray.add(message);
+                        display.removeMessages(messageArray);
+                    }
+                }); 
+            }
+            
+        }));
+        registerHandler(display.getSelectAllClick().addClickHandler(new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                display.deselectAllMessages();
+                display.selectAllMessages();
+            }
+            
+        }));
+        
+        registerHandler(display.getSelectNoneClick().addClickHandler(new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                display.deselectAllMessages();
+            }
+            
+        }));
+
+
+        registerHandler(display.getDeleteClick().addClickHandler(new com.google.gwt.event.dom.client.ClickHandler() {
+
+            public void onClick(com.google.gwt.event.dom.client.ClickEvent event) {
+                if (folder.getFullName().equals(user.getSettings().getTrashFolderName())) {
+                    display.getConfirmDeleteDialog().show();
+                } else {
+                    deleteMessages();
+                }
+                
+            }
+            
+        }));
+        registerHandler(display.getConfirmDeleteDialogClick().addClickHandler(new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                deleteMessages();
+            }
+            
+        }));
+        
+        registerHandler(display.getNewClick().addClickHandler(new com.google.gwt.event.dom.client.ClickHandler() {
+
+            public void onClick(com.google.gwt.event.dom.client.ClickEvent event) {
+                eventBus.fireEvent(new NewMessageEvent());
+            }
+            
+        }));
+        
+        registerHandler(display.getDeleteAllClick().addClickHandler(new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                display.getConfirmDeleteAllDialog().center();
+            }
+            
+        }));
+        
+        registerHandler(display.getConfirmDeleteAllDialogClick().addClickHandler(new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                dispatcher.execute(new DeleteAllMessages(folder), new HupaCallback<DeleteMessageResult>(dispatcher, eventBus) {
+                    public void callback(DeleteMessageResult result) {
+                        display.reset();
+                        display.reloadData();
+//                        eventBus.fireEvent(new DecreaseUnseenEvent(user,folder,result.getCount()));
+                    }
+                });
+            }
+            
+        }));
+        registerHandler(display.getMarkSeenClick().addClickHandler( new ClickHandler() {
+            public void onClick(ClickEvent event) {
+                final ArrayList<Message> selectedMessages = new ArrayList<Message>(display.getSelectedMessages());
+                ArrayList<Long> uids = new ArrayList<Long>();
+                for (Message m : selectedMessages) {
+                    if (m.getFlags().contains(IMAPFlag.SEEN) == false) {
+                        uids.add(m.getUid());
+                    } else {
+                        selectedMessages.remove(m);
+                    }
+                }
+                dispatcher.execute(new SetFlag(folder, IMAPFlag.SEEN, true, uids), new HupaCallback<GenericResult>(dispatcher, eventBus) {
+                    public void callback(GenericResult result) {
+                        for (Message m : selectedMessages) {
+                            if (m.getFlags().contains(IMAPFlag.SEEN) == false) {
+                                m.getFlags().add(IMAPFlag.SEEN);
+                            }
+                        }
+                        display.redraw();
+                        eventBus.fireEvent(new DecreaseUnseenEvent(user, folder,selectedMessages.size()));
+                    }
+                });
+            }
+
+        }));
+        
+        registerHandler(display.getMarkUnseenClick().addClickHandler(new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                final ArrayList<Message> selectedMessages = new ArrayList<Message>(display.getSelectedMessages());
+                ArrayList<Long> uids = new ArrayList<Long>();
+                for (Message m : selectedMessages) {
+                    if (m.getFlags().contains(IMAPFlag.SEEN)) {
+                        uids.add(m.getUid());
+                    } else {
+                        selectedMessages.remove(m);
+                    }
+                }
+                
+                dispatcher.execute(new SetFlag(folder, IMAPFlag.SEEN, false, uids), new HupaCallback<GenericResult>(dispatcher, eventBus) {
+                    public void callback(GenericResult result) {
+                        for (Message m : selectedMessages) {
+                            if (m.getFlags().contains(IMAPFlag.SEEN)) {
+                                m.getFlags().remove(IMAPFlag.SEEN);
+                            }
+                        }
+                        display.redraw();
+                        eventBus.fireEvent(new IncreaseUnseenEvent(user, folder,selectedMessages.size()));
+                    }
+                });
+            }
+            
+            
+        }));
+        registerHandler(eventBus.addHandler(FolderSelectionEvent.TYPE, new FolderSelectionEventHandler() {
+
+            public void onFolderSelectionEvent(FolderSelectionEvent event) {
+                folder = event.getFolder();
+                user = event.getUser();
+                firePresenterChangedEvent();
+            }
+            
+        }));
+        registerHandler(new HandlerRegistrationAdapter(display.getDataTableSelection().addRowSelectionHandler(new RowSelectionHandler() {
+                public void onRowSelection(RowSelectionEvent event) {
+                    if (event.getSelectedRows().size() == 0) {
+                        display.getDeleteEnable().setEnabled(false);
+                        display.getMarkSeenEnable().setEnabled(false);
+                        display.getMarkUnseenEnable().setEnabled(false);
+                    } else {
+                        display.getDeleteEnable().setEnabled(true);
+                        display.getMarkSeenEnable().setEnabled(true);
+                        display.getMarkUnseenEnable().setEnabled(true);
+                    }
+                }
+                
+            
+            
+        })));
+        
+        registerHandler(display.getRefreshClick().addClickHandler(new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                display.reset();
+                display.reloadData();
+            }
+            
+        }));
+        registerHandler(new HandlerRegistrationAdapter(display.getDataTablePageChange().addPageChangeHandler(new PageChangeHandler() {
+
+            public void onPageChange(PageChangeEvent event) {
+                //firePresenterRevealedEvent(true);
+                firePresenterChangedEvent();
+            }
+            
+        })));
+        registerHandler(display.getRowsPerPageChange().addChangeHandler(new ChangeHandler() {
+
+            public void onChange(ChangeEvent event) {
+                //firePresenterRevealedEvent(true);
+                firePresenterChangedEvent();
+            }
+            
+        }));
+        display.addTableListener(tableListener);
+    }
+
+    
+    private void deleteMessages() {
+        final ArrayList<Message> selectedMessages = new ArrayList<Message>(display.getSelectedMessages());
+        ArrayList<Long> uids = new ArrayList<Long>();
+        for (Message m : selectedMessages) {
+            uids.add(m.getUid());
+        }
+        // maybe its better to just remove the messages from the table and expect the removal will work
+        display.removeMessages(selectedMessages);
+
+        dispatcher.execute(new DeleteMessageByUid(folder,uids), new HupaCallback<DeleteMessageResult>(dispatcher, eventBus) {
+            public void callback(DeleteMessageResult result) {
+                eventBus.fireEvent(new DecreaseUnseenEvent(user,folder,result.getCount()));
+            }
+        }); 
+    }
+ 
+
+    /*
+     * (non-Javadoc)
+     * @see net.customware.gwt.presenter.client.BasicPresenter#onUnbind()
+     */
+    protected void onUnbind() {
+        display.removeTableListener(tableListener);
+    }
+
+    
+    private final class ShowMessageTableListener implements TableListener {
+
+        public void onCellClicked(SourcesTableEvents sender, int row,
+                int cell) {
+            
+            display.setExpandLoading(true);
+            Message message = display.getData(row);
+            
+            // mark the message as seen and redraw the table to reflect this
+            if (message.getFlags().contains(Message.IMAPFlag.SEEN) == false) {
+                // add flag, fire event and redraw
+                message.getFlags().add(Message.IMAPFlag.SEEN);
+                eventBus.fireEvent(new DecreaseUnseenEvent(user,folder,1));
+                
+                display.redraw();
+
+            }
+            
+            eventBus.fireEvent(new ExpandMessageEvent(user,folder,message));
+        }
+
+    }
+
+    @Override
+    protected void onRevealDisplay() {
+        display.reloadData();  
+    }
+    
+    public void revealDisplay(User user, IMAPFolder folder, String searchValue) {
+        this.user = user;
+       
+        if (this.folder == null || this.folder.getFullName().equals(folder.getFullName()) == false 
+                || (searchValue == null && this.searchValue != null) || (searchValue != null && searchValue.equals(this.searchValue) == false)) {
+            display.reset();
+            display.deselectAllMessages();
+        }
+        display.setExpandLoading(false);
+        this.searchValue = searchValue;
+        this.folder = folder;
+        revealDisplay();
+    }
+
+}

Added: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessageListView.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessageListView.java?rev=1516205&view=auto
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessageListView.java (added)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessageListView.java Wed Aug 21 16:35:16 2013
@@ -0,0 +1,800 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.hupa.client.mvp;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.hupa.client.HupaCSS;
+import org.apache.hupa.client.HupaConstants;
+import org.apache.hupa.client.HupaMessages;
+import org.apache.hupa.client.bundles.HupaImageBundle;
+import org.apache.hupa.client.dnd.PagingScrollTableRowDragController;
+import org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display;
+import org.apache.hupa.client.widgets.CommandsBar;
+import org.apache.hupa.client.widgets.ConfirmDialogBox;
+import org.apache.hupa.client.widgets.DragRefetchPagingScrollTable;
+import org.apache.hupa.client.widgets.EnableButton;
+import org.apache.hupa.client.widgets.HasDialog;
+import org.apache.hupa.client.widgets.DragRefetchPagingScrollTable.DragHandlerFactory;
+import org.apache.hupa.shared.data.Message;
+import org.apache.hupa.shared.data.Message.IMAPFlag;
+import org.apache.hupa.widgets.ui.HasEnable;
+import org.apache.hupa.widgets.ui.Loading;
+import org.apache.hupa.widgets.ui.PagingOptions;
+import org.cobogw.gwt.user.client.ui.Button;
+import org.cobogw.gwt.user.client.ui.ButtonBar;
+
+import com.google.gwt.event.dom.client.ChangeEvent;
+import com.google.gwt.event.dom.client.ChangeHandler;
+import com.google.gwt.event.dom.client.HasChangeHandlers;
+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.gen2.table.client.AbstractColumnDefinition;
+import com.google.gwt.gen2.table.client.CachedTableModel;
+import com.google.gwt.gen2.table.client.CellRenderer;
+import com.google.gwt.gen2.table.client.ColumnDefinition;
+import com.google.gwt.gen2.table.client.DefaultTableDefinition;
+import com.google.gwt.gen2.table.client.FixedWidthFlexTable;
+import com.google.gwt.gen2.table.client.FixedWidthGrid;
+import com.google.gwt.gen2.table.client.FixedWidthGridBulkRenderer;
+import com.google.gwt.gen2.table.client.MutableTableModel;
+import com.google.gwt.gen2.table.client.AbstractScrollTable.ColumnResizePolicy;
+import com.google.gwt.gen2.table.client.AbstractScrollTable.ResizePolicy;
+import com.google.gwt.gen2.table.client.AbstractScrollTable.ScrollPolicy;
+import com.google.gwt.gen2.table.client.AbstractScrollTable.SortPolicy;
+import com.google.gwt.gen2.table.client.SelectionGrid.SelectionPolicy;
+import com.google.gwt.gen2.table.client.TableDefinition.AbstractCellView;
+import com.google.gwt.gen2.table.event.client.HasPageChangeHandlers;
+import com.google.gwt.gen2.table.event.client.HasPageLoadHandlers;
+import com.google.gwt.gen2.table.event.client.HasRowSelectionHandlers;
+import com.google.gwt.gen2.table.event.client.PageLoadEvent;
+import com.google.gwt.gen2.table.event.client.PageLoadHandler;
+import com.google.gwt.gen2.table.event.client.RowCountChangeEvent;
+import com.google.gwt.gen2.table.event.client.RowCountChangeHandler;
+import com.google.gwt.i18n.client.DateTimeFormat;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.HasValue;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.Hyperlink;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.ListBox;
+import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
+import com.google.gwt.user.client.ui.SuggestBox;
+import com.google.gwt.user.client.ui.TableListener;
+import com.google.gwt.user.client.ui.VerticalPanel;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.inject.Inject;
+
+
+@SuppressWarnings("deprecation")
+public class IMAPMessageListView extends Composite implements Display{
+
+    private static final int DEFAULT_MSG_PAGE_SIZE = 25;
+    
+    @SuppressWarnings("unused")
+    private HupaMessages messages;
+    private HupaImageBundle imageBundle;
+
+    private PagingOptions pagingBar;
+    private DragRefetchPagingScrollTable<Message> mailTable;
+    private CachedTableModel<Message> cTableModel;
+
+    private FixedWidthGrid dataTable = createDataTable();
+    private EnableButton deleteMailButton;
+    private Button newMailButton;
+    private Button deleteAllMailButton;
+    private ConfirmDialogBox confirmBox = new ConfirmDialogBox();
+    private ConfirmDialogBox confirmDeleteAllBox = new ConfirmDialogBox();
+    private EnableButton markSeenButton;
+    private EnableButton markUnSeenButton;
+
+    private ListBox pageBox = new ListBox();
+    private Hyperlink allLink;    
+    private Hyperlink noneLink;
+    private Hyperlink refreshLink;
+    private MultiWordSuggestOracle oracle = new MultiWordSuggestOracle(" ,@");
+    private SuggestBox searchBox = new SuggestBox(oracle);
+    private Button searchButton;
+    private Loading loading;
+    
+    @Inject
+    public IMAPMessageListView(final PagingScrollTableRowDragController controller, final MessageTableModel mTableModel, final HupaConstants constants, final HupaMessages messages, final HupaImageBundle imageBundle) {
+        this.messages = messages;
+        this.imageBundle = imageBundle;
+        
+        deleteMailButton = new EnableButton(constants.deleteMailButton());
+        newMailButton = new Button(constants.newMailButton());
+        deleteAllMailButton = new Button(constants.deleteAll());
+        markSeenButton = new EnableButton(constants.markSeen());
+        markUnSeenButton = new EnableButton(constants.markUnseen());
+        allLink = new Hyperlink(constants.all(),"");    
+        noneLink = new Hyperlink(constants.none(),"");
+        refreshLink = new Hyperlink(constants.refresh(),"");
+        searchButton = new Button(constants.searchButton());
+        loading = new Loading(constants.loading());
+        this.cTableModel = new CachedTableModel<Message>(mTableModel);
+        cTableModel.setRowCount(MutableTableModel.UNKNOWN_ROW_COUNT);
+        mTableModel.addRowCountChangeHandler(new RowCountChangeHandler() {
+            
+            public void onRowCountChange(RowCountChangeEvent event) {
+                cTableModel.setRowCount(event.getNewRowCount());
+            }
+        });
+        
+        VerticalPanel msgListContainer = new VerticalPanel();
+        msgListContainer.addStyleName(HupaCSS.C_msg_list_container);
+        mailTable = new DragRefetchPagingScrollTable<Message>(
+                cTableModel, dataTable, new FixedWidthFlexTable(),
+                createTableDefinitation(),controller,1);
+        mailTable.setPageSize(20);
+        mailTable.setDragHandler(0,30, new DragHandlerFactory() {
+
+            public Widget createHandler() {
+                return new Image(imageBundle.readyToMoveMailIcon());
+            }
+            
+        });
+        
+        HTML emptyTable = new HTML(constants.emptyMailTable());
+        emptyTable.addStyleName(HupaCSS.C_msg_table_empty);
+        mailTable.setEmptyTableWidget(emptyTable);
+        FixedWidthGridBulkRenderer<Message> bulkRenderer = new FixedWidthGridBulkRenderer<Message>(mailTable.getDataTable(),mailTable);
+        mailTable.setBulkRenderer(bulkRenderer);
+        mailTable.addStyleName(HupaCSS.C_msg_table);
+        mailTable.setCellPadding(0);
+        mailTable.setResizePolicy(ResizePolicy.FILL_WIDTH);
+        mailTable.setColumnResizePolicy(ColumnResizePolicy.MULTI_CELL);
+        mailTable.setScrollPolicy(ScrollPolicy.DISABLED);
+        mailTable.addPageLoadHandler(onMessagePageLoadHandler);
+        mailTable.setPageSize(DEFAULT_MSG_PAGE_SIZE);
+        mailTable.getDataTable().setCellSpacing(0);
+        mailTable.setSortPolicy(SortPolicy.DISABLED);
+
+        mailTable.fillWidth();
+        
+        pagingBar = new PagingOptions(mailTable, constants, loading);
+        
+        HorizontalPanel buttonBar = new HorizontalPanel();
+        buttonBar.addStyleName(HupaCSS.C_buttons);
+        
+        ButtonBar navigatorBar = new ButtonBar();
+        navigatorBar.add(newMailButton);
+        deleteMailButton.setEnabled(false);
+        navigatorBar.add(deleteMailButton);
+        buttonBar.add(navigatorBar);
+        buttonBar.add(deleteAllMailButton);
+        
+        ButtonBar markButtonBar = new ButtonBar();
+        markButtonBar.add(markSeenButton);
+        markButtonBar.add(markUnSeenButton);
+        buttonBar.add(markButtonBar);
+        buttonBar.add(refreshLink);
+        pageBox.addItem("" + DEFAULT_MSG_PAGE_SIZE);
+        pageBox.addItem("" + (DEFAULT_MSG_PAGE_SIZE * 2));
+        pageBox.addItem("" + (DEFAULT_MSG_PAGE_SIZE * 4));
+        pageBox.addChangeHandler(new ChangeHandler() {
+            public void onChange(ChangeEvent event) {
+                if (pageBox.getSelectedIndex() > 0)
+                    mailTable.setPageSize(Integer.parseInt(pageBox.getItemText(pageBox.getSelectedIndex())));
+            }
+        });
+      
+        
+        HorizontalPanel searchPanel = new HorizontalPanel();
+        searchPanel.addStyleName(HupaCSS.C_buttons);
+
+        searchBox.addStyleName(HupaCSS.C_msg_search);
+        searchBox.setAnimationEnabled(true);
+        searchBox.setAutoSelectEnabled(false);
+        searchBox.setLimit(20);
+        searchBox.addKeyUpHandler(new KeyUpHandler() {
+
+            public void onKeyUp(KeyUpEvent event) {
+                if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
+                    searchButton.click();
+                }
+            }
+
+        });
+        searchPanel.add(searchBox);
+        searchPanel.add(searchButton);
+        searchPanel.add(pageBox);
+
+        HorizontalPanel hPanel = new HorizontalPanel();
+        hPanel.addStyleName(HupaCSS.C_msg_top_bar);
+        hPanel.add(buttonBar);
+        hPanel.add(searchPanel);
+        hPanel.setCellHorizontalAlignment(searchPanel, HorizontalPanel.ALIGN_RIGHT);        
+
+        msgListContainer.add(hPanel);
+        
+        CommandsBar commandsBar = new CommandsBar();
+        commandsBar.addLeft(new HTML(constants.select() +":"));
+        commandsBar.addLeft(allLink);
+        commandsBar.addLeft(noneLink);
+        commandsBar.add(loading);
+        commandsBar.addRight(pagingBar);
+        
+        msgListContainer.add(commandsBar);
+        msgListContainer.add(mailTable);
+        
+        confirmBox.setText(messages.confirmDeleteMessages());
+        confirmDeleteAllBox.setText(messages.confirmDeleteAllMessages());
+        initWidget(msgListContainer);
+    }
+    
+    
+    PageLoadHandler onMessagePageLoadHandler = new PageLoadHandler() {
+
+        public void onPageLoad(PageLoadEvent event) {
+
+            for (int i = 0; i < mailTable.getDataTable().getRowCount(); i++) {
+                mailTable.getDataTable().getRowFormatter().setStyleName(i, HupaCSS.C_msg_table_row);
+                Message msg = mailTable.getRowValue(i);
+                if (msg != null) {
+                    if (msg.getFlags().contains(IMAPFlag.SEEN) == false) {
+                        mailTable.getDataTable().getRowFormatter().addStyleName(i,HupaCSS.C_msg_table_unseen);
+                    } else {
+                        mailTable.getDataTable().getRowFormatter().removeStyleName(i, HupaCSS.C_msg_table_seen);
+                    }
+                }
+            }
+            
+            String nrows = String.valueOf(mailTable.getPageSize());
+            for (int i = 0; i<pageBox.getItemCount(); i++) {
+                if (nrows.equals(pageBox.getItemText(i)))
+                    pageBox.setSelectedIndex(i);
+            }
+        }
+        
+    };
+    
+    private DefaultTableDefinition<Message> createTableDefinitation() {
+        DefaultTableDefinition<Message> def = new DefaultTableDefinition<Message>(createColumnDefinitionList());
+        
+        return def;
+    }
+
+    
+    /**
+       * @return the newly created data table.
+       */
+      private FixedWidthGrid createDataTable() {
+        FixedWidthGrid dataTable = new FixedWidthGrid();
+        dataTable.setSelectionPolicy(SelectionPolicy.CHECKBOX);
+        return dataTable;
+      }
+
+    /**
+     * Create a new List which holds all needed ColumnDefinitions 
+     * 
+     */
+    private List<ColumnDefinition<Message, ?>> createColumnDefinitionList() {
+        List<ColumnDefinition<Message, ?>> cList = new ArrayList<ColumnDefinition<Message, ?>>();
+
+        FromColumnDefination from = new FromColumnDefination();
+        from.setCellRenderer(new WhiteSpaceCellRenderer<Message>());
+        from.setColumnTruncatable(true);
+        from.setPreferredColumnWidth(250);
+        from.setMinimumColumnWidth(150);
+        from.setMaximumColumnWidth(300);
+        cList.add(from);
+
+        
+        SubjectColumnDefination subject =new SubjectColumnDefination();
+        subject.setCellRenderer(new WhiteSpaceCellRenderer<Message>());
+        subject.setColumnTruncatable(true);
+        subject.setPreferredColumnWidth(800);
+        subject.setMinimumColumnWidth(200);
+        cList.add(subject);
+        
+        AttachmentColumnDefination attachment = new AttachmentColumnDefination();
+        attachment.setColumnTruncatable(false);
+        // display an image if the message contains an attachment
+        attachment.setCellRenderer(new CellRenderer<Message, Boolean>() {
+
+            public void renderRowValue(Message rowValue,
+                    ColumnDefinition<Message, Boolean> columnDef,
+                    AbstractCellView<Message> view) {
+                if (columnDef.getCellValue(rowValue)) {
+                    view.setWidget(new Image(imageBundle.attachmentIcon()));
+                } else {
+                    view.setHTML("&nbsp");
+                }
+                
+            }
+            
+        });
+        
+        attachment.setPreferredColumnWidth(20);
+        attachment.setMinimumColumnWidth(15);
+        attachment.setMaximumColumnWidth(25);
+        cList.add(attachment);
+        
+        DateColumnDefination date = new DateColumnDefination();
+        date.setColumnTruncatable(true);
+        // set a special renderer for the date
+        date.setCellRenderer(new CellRenderer<Message, Date>() {
+
+            public void renderRowValue(Message rowValue,
+                    ColumnDefinition<Message, Date> columnDef,
+                    AbstractCellView<Message> view) {
+                DateTimeFormat dtformat;
+                Date rDate = rowValue.getReceivedDate();
+                int rYear = rDate.getYear();
+                int rMonth = rDate.getMonth();
+                int rDay = rDate.getDate();
+                
+                Date now = new Date();
+                int nowYear = now.getYear();
+                int nowMonth = now.getMonth();
+                int nowDay = now.getDate();
+                
+                if (rYear < nowYear) {
+                    dtformat = DateTimeFormat.getFormat("dd.MMM.yyyy");
+                } else if (rMonth < nowMonth || (rMonth == nowMonth && rDay < nowDay)) {
+                    dtformat = DateTimeFormat.getFormat("dd.MMM.");
+                } else if (rDay == nowDay){
+                    dtformat = DateTimeFormat.getFormat("HH:mm");
+                } else {
+
+                    dtformat = DateTimeFormat.getFormat("dd.MMM.yyyy HH:mm");
+                }
+            
+                view.setHTML(dtformat.format(rDate));
+                view.setHorizontalAlignment(HorizontalPanel.ALIGN_RIGHT);
+            }
+            
+        });
+        date.setPreferredColumnWidth(100);
+        date.setMinimumColumnWidth(100);
+        date.setMaximumColumnWidth(150);
+        
+        cList.add(date);
+        
+        return cList;
+    }
+    
+   
+
+    
+    /**
+     * ColumnDefination which display if the message contains an attachment
+     * @author Norman
+     *
+     */
+    private static final class AttachmentColumnDefination extends AbstractColumnDefinition<Message, Boolean> {
+
+        @Override
+        public Boolean getCellValue(Message rowValue) {
+            return rowValue.hasAttachment();
+        }
+
+        @Override
+        public void setCellValue(Message rowValue, Boolean cellValue) {
+        }
+        
+    }
+
+    /**
+     * ColumnDefination which display the From 
+     *
+     */
+    private static final class FromColumnDefination extends AbstractColumnDefinition<Message, String> {
+
+        @Override
+        public String getCellValue(Message rowValue) {
+            return rowValue.getFrom();
+        }
+
+        @Override
+        public void setCellValue(Message rowValue, String cellValue) {
+            rowValue.setFrom(cellValue);
+        }
+        
+    }
+    
+    /**
+     * ColumnDefination which display the Subject
+     *
+     */
+    private static final class SubjectColumnDefination extends AbstractColumnDefinition<Message, String> {
+
+        @Override
+        public String getCellValue(Message rowValue) {
+            return rowValue.getSubject();
+        }
+
+        @Override
+        public void setCellValue(Message rowValue, String cellValue) {
+            rowValue.setSubject(cellValue);
+
+        }
+        
+    }
+    
+    /**
+     * ColumnDefination which display the Date
+     * 
+     */
+    private static final class DateColumnDefination extends AbstractColumnDefinition<Message, Date> {
+
+        @Override
+        public Date getCellValue(Message rowValue) {
+            return rowValue.getReceivedDate();
+        }
+
+        @Override
+        public void setCellValue(Message rowValue, Date cellValue) {
+            rowValue.setReceivedDate(cellValue);
+        }
+        
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getDataTableSelection()
+     */
+    public HasRowSelectionHandlers getDataTableSelection() {
+        return mailTable.getDataTable();
+    }
+    
+
+    public void reloadData() {
+        mailTable.reloadPage();
+    }
+    
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#reset()
+     */
+    public void reset() {
+        pageBox.setSelectedIndex(0);
+        cTableModel.clearCache();
+        cTableModel.setRowCount(CachedTableModel.UNKNOWN_ROW_COUNT);
+        mailTable.gotoFirstPage();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getDataTableLoad()
+     */
+    public HasPageLoadHandlers getDataTableLoad() {
+        return mailTable;
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see net.customware.gwt.presenter.client.widget.WidgetDisplay#asWidget()
+     */
+    public Widget asWidget() {
+        return this;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getDeleteClick()
+     */
+    public HasClickHandlers getDeleteClick() {
+        return deleteMailButton;
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getNewClick()
+     */
+    public HasClickHandlers getNewClick() {
+        return newMailButton;
+    }
+    
+    /**
+     * Renderer which fill empty rows with a whitespace 
+     *
+     * @param <E> RowType
+     */
+    private static final class WhiteSpaceCellRenderer<E> implements CellRenderer<E, String> {
+
+        /*
+         * (non-Javadoc)
+         * @see com.google.gwt.gen2.table.client.CellRenderer#renderRowValue(java.lang.Object, com.google.gwt.gen2.table.client.ColumnDefinition, com.google.gwt.gen2.table.client.TableDefinition.AbstractCellView)
+         */
+        public void renderRowValue(E rowValue,
+                ColumnDefinition<E, String> columnDef, AbstractCellView<E> view) {
+            String cellValue = columnDef.getCellValue(rowValue);
+            if (cellValue == null || cellValue.length() < 1) {
+                view.setHTML("&nbsp");
+            } else {
+                view.setHTML(cellValue);
+            }
+        }
+
+        
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getData(int)
+     */
+    public Message getData(int rowIndex) {
+        return mailTable.getRowValue(rowIndex);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getConfirmDialog()
+     */
+    public HasDialog getConfirmDeleteDialog() {
+        return confirmBox;
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getConfirmDeleteDialogClick()
+     */
+    public HasClickHandlers getConfirmDeleteDialogClick() {
+        return confirmBox;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getConfirmDeleteAllDialog()
+     */
+    public HasDialog getConfirmDeleteAllDialog() {
+        return confirmDeleteAllBox;
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getConfirmDeleteAllDialogClick()
+     */
+    public HasClickHandlers getConfirmDeleteAllDialogClick() {
+        return confirmDeleteAllBox;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#deselectAllMessages()
+     */
+    public void deselectAllMessages() {
+        mailTable.getDataTable().deselectAllRows();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getSelectAllClick()
+     */
+    public HasClickHandlers getSelectAllClick() {
+        return allLink;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getSelectNoneClick()
+     */
+    public HasClickHandlers getSelectNoneClick() {
+        return noneLink;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#selectAllMessages()
+     */
+    public void selectAllMessages() {
+        mailTable.getDataTable().selectAllRows();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getSelectedMessages()
+     */
+    public ArrayList<Message> getSelectedMessages() {
+        return mailTable.getSelectedRows();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#removeMessages(java.util.ArrayList)
+     */
+    public void removeMessages(ArrayList<Message> messages) {
+        mailTable.removeRows(messages);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#addTableListener(com.google.gwt.user.client.ui.TableListener)
+     */
+    public void addTableListener(TableListener listener) {
+        dataTable.addTableListener(listener);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#removeTableListener(com.google.gwt.user.client.ui.TableListener)
+     */
+    public void removeTableListener(TableListener listener) {
+        dataTable.removeTableListener(listener);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#setPostFetchMessageCount(int)
+     */
+    public void setPostFetchMessageCount(int count) {
+        cTableModel.setPostCachedRowCount(count);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#redraw()
+     */
+    public void redraw() {
+        mailTable.reloadPage();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getDeleteAllClick()
+     */
+    public HasClickHandlers getDeleteAllClick() {
+        return deleteAllMailButton;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getMarkSeenClick()
+     */
+    public HasClickHandlers getMarkSeenClick() {
+        return markSeenButton;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getMarkUnseenClick()
+     */
+    public HasClickHandlers getMarkUnseenClick() {
+        return markUnSeenButton;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getDeleteEnable()
+     */
+    public HasEnable getDeleteEnable() {
+        return deleteMailButton;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getMarkSeenEnable()
+     */
+    public HasEnable getMarkSeenEnable() {
+        return markSeenButton;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getMarkUnseenEnable()
+     */
+    public HasEnable getMarkUnseenEnable() {
+        return markUnSeenButton;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getRefreshClick()
+     */
+    public HasClickHandlers getRefreshClick() {
+        return refreshLink;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#goToPage(int)
+     */
+    public void goToPage(int page) {
+        if (page != mailTable.getCurrentPage()) {
+            mailTable.gotoPage(page, false);
+        }
+    }
+    
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getCurrentPage()
+     */
+    public int getCurrentPage() {
+        return mailTable.getCurrentPage();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getDataTablePageChange()
+     */
+    public HasPageChangeHandlers getDataTablePageChange() {
+        return mailTable;
+    }
+    
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getRowsPerPageIndex()
+     */
+    public int getRowsPerPageIndex() {
+        return pageBox.getSelectedIndex();
+    }
+    
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.IMAPMessageListPresenter.Display#getRowsPerPageChange()
+     */
+    public HasChangeHandlers getRowsPerPageChange() {
+        return pageBox;
+    }
+    
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.MainPresenter.Display#getSearchClick()
+     */
+    public HasClickHandlers getSearchClick() {
+        return searchButton;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.MainPresenter.Display#getSearchValue()
+     */
+    public HasValue<String> getSearchValue() {
+        return searchBox;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.MainPresenter.Display#fillSearchOracle(java.util.ArrayList)
+     */
+    public void fillSearchOracle(ArrayList<Message> messages) {
+        for (Message m : messages) {
+            String subject = m.getSubject();
+            String from = m.getFrom();
+            if (subject != null && subject.trim().length() > 0) {
+                oracle.add(subject.trim());
+            }
+            if (from != null && from.trim().length() > 0) {
+                oracle.add(from.trim());
+            }
+        }
+        //searchBox.setText("");
+    }
+
+    public void setExpandLoading(boolean expanding) {
+        if (expanding) {
+            loading.show();
+        } else {
+            loading.hide();
+        }
+    }
+}

Added: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessagePresenter.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessagePresenter.java?rev=1516205&view=auto
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessagePresenter.java (added)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessagePresenter.java Wed Aug 21 16:35:16 2013
@@ -0,0 +1,164 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.hupa.client.mvp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.customware.gwt.presenter.client.EventBus;
+import net.customware.gwt.presenter.client.widget.WidgetDisplay;
+import net.customware.gwt.presenter.client.widget.WidgetPresenter;
+
+import org.apache.hupa.client.CachingDispatchAsync;
+import org.apache.hupa.client.HupaCallback;
+import org.apache.hupa.shared.SConsts;
+import org.apache.hupa.shared.data.IMAPFolder;
+import org.apache.hupa.shared.data.Message;
+import org.apache.hupa.shared.data.MessageAttachment;
+import org.apache.hupa.shared.data.MessageDetails;
+import org.apache.hupa.shared.data.User;
+import org.apache.hupa.shared.events.BackEvent;
+import org.apache.hupa.shared.events.ForwardMessageEvent;
+import org.apache.hupa.shared.events.LoadMessagesEvent;
+import org.apache.hupa.shared.events.ReplyMessageEvent;
+import org.apache.hupa.shared.rpc.DeleteMessageByUid;
+import org.apache.hupa.shared.rpc.DeleteMessageResult;
+
+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.user.client.Window;
+import com.google.inject.Inject;
+
+public class IMAPMessagePresenter extends WidgetPresenter<IMAPMessagePresenter.Display>{
+
+    public interface Display extends WidgetDisplay{
+        
+        public void setHeaders(Message msg);
+        public void setAttachments(List<MessageAttachment> attachements, String folder,  long uid);
+        public void setContent(String content);
+        
+        public HasClickHandlers getShowRawMessageClick();
+        public HasClickHandlers getDeleteButtonClick();
+        public HasClickHandlers getReplyButtonClick();
+        public HasClickHandlers getReplyAllButtonClick();
+        public HasClickHandlers getForwardButtonClick();
+        public HasClickHandlers getBackButtonClick();
+    }
+
+    private MessageDetails messageDetails;
+    private Message message;
+    private CachingDispatchAsync dispatcher;
+    private IMAPFolder folder;
+    private User user;
+
+    @Inject
+    private IMAPMessagePresenter(IMAPMessagePresenter.Display display,EventBus bus, CachingDispatchAsync dispatcher) {
+        super(display,bus);
+        this.dispatcher = dispatcher;
+    }
+
+    
+    public void revealDisplay(User user, IMAPFolder folder, Message message, MessageDetails messageDetails) {
+        this.message = message;
+        this.messageDetails = messageDetails;
+        this.folder = folder;
+        this.user = user;
+        updateDisplay();
+        firePresenterChangedEvent();
+        revealDisplay();
+    }
+
+    private void updateDisplay() {
+        display.setAttachments(messageDetails.getMessageAttachments(), folder.getFullName(),message.getUid());
+        display.setHeaders(message);
+        display.setContent(messageDetails.getText());
+    }
+
+    @Override
+    protected void onBind() {
+        registerHandler(display.getDeleteButtonClick().addClickHandler(new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                ArrayList<Long> uidList = new ArrayList<Long>();
+                uidList.add(message.getUid());
+                dispatcher.execute(new DeleteMessageByUid(folder, uidList), new HupaCallback<DeleteMessageResult>(dispatcher, eventBus) {
+                    public void callback(DeleteMessageResult result) {
+                        eventBus.fireEvent(new LoadMessagesEvent(user,folder));
+                    }
+                }); 
+            }
+
+        }));
+        
+        registerHandler(display.getForwardButtonClick().addClickHandler(new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                eventBus.fireEvent(new ForwardMessageEvent(user,folder,message, messageDetails));
+            }
+            
+        }));
+        
+        registerHandler(display.getReplyButtonClick().addClickHandler(new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                eventBus.fireEvent(new ReplyMessageEvent(user,folder,message, messageDetails, false));
+            }
+            
+        }));
+        
+        registerHandler(display.getReplyAllButtonClick().addClickHandler(new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                eventBus.fireEvent(new ReplyMessageEvent(user,folder,message, messageDetails, true));
+            }
+            
+        }));
+        registerHandler(display.getBackButtonClick().addClickHandler(new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                eventBus.fireEvent(new BackEvent());
+            }
+            
+        }));
+        registerHandler(display.getShowRawMessageClick().addClickHandler(new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                String message_url = GWT.getModuleBaseURL() + SConsts.SERVLET_SOURCE + 
+                "?" + SConsts.PARAM_UID + "=" + message.getUid() + 
+                "&" + SConsts.PARAM_FOLDER + "=" + folder.getFullName();
+                Window.open(message_url, "_blank", "");
+            }
+            
+        }));
+    }
+
+
+    @Override
+    protected void onUnbind() {
+    }
+
+
+    @Override
+    protected void onRevealDisplay() {
+
+    }
+}

Added: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessageView.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessageView.java?rev=1516205&view=auto
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessageView.java (added)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/IMAPMessageView.java Wed Aug 21 16:35:16 2013
@@ -0,0 +1,201 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.hupa.client.mvp;
+
+import java.util.List;
+
+import org.apache.hupa.client.HupaCSS;
+import org.apache.hupa.client.HupaConstants;
+import org.apache.hupa.client.bundles.HupaImageBundle;
+import org.apache.hupa.client.mvp.IMAPMessagePresenter.Display;
+import org.apache.hupa.client.widgets.CommandsBar;
+import org.apache.hupa.client.widgets.MessageHeaders;
+import org.apache.hupa.shared.SConsts;
+import org.apache.hupa.shared.Util;
+import org.apache.hupa.shared.data.Message;
+import org.apache.hupa.shared.data.MessageAttachment;
+import org.apache.hupa.widgets.ui.Loading;
+import org.cobogw.gwt.user.client.ui.Button;
+
+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.user.client.DOM;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.Hyperlink;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.RootPanel;
+import com.google.gwt.user.client.ui.ScrollPanel;
+import com.google.gwt.user.client.ui.VerticalPanel;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.inject.Inject;
+
+public class IMAPMessageView extends Composite implements Display{
+
+    public final static int DELETE_BUTTON = 0;
+    public final static int REPLY_BUTTON = 1;
+    public final static int REPLY_ALL_BUTTON = 2;
+    
+    private HupaImageBundle imageBundle;
+
+    private VerticalPanel messageContainer = new VerticalPanel();
+    private MessageHeaders headers;
+    private CommandsBar buttonsBar = new CommandsBar();
+    private HTML msgArea = new HTML();
+    
+    private Label from = new Label();
+    private Label cc = new Label();
+    private Label to = new Label();
+    private Label subject = new Label();
+    
+    private Button deleteMsgButton = new Button();
+    private Button replyMsgButton = new Button();
+    private Button replyAllMsgButton = new Button();
+    private Button forwardMsgButton = new Button();
+    private Hyperlink showRawButton;
+    private Hyperlink backButton;
+    private FlowPanel attachments = new FlowPanel();
+    
+    private Loading loading;
+
+    @Inject
+    public IMAPMessageView(HupaConstants constants, HupaImageBundle imageBundle) {
+        this.imageBundle = imageBundle;
+        
+        loading = new Loading(constants.loading());
+        showRawButton = new Hyperlink(constants.rawButton(),"");
+        backButton = new Hyperlink(constants.backButton(),"");
+        headers = new MessageHeaders(constants);
+        deleteMsgButton.setText(constants.deleteMailButton());
+        replyMsgButton.setText(constants.replyMailButton());
+        replyAllMsgButton.setText(constants.replyAllMailButton());
+        forwardMsgButton.setText(constants.forwardMailButton());    
+        
+        messageContainer.addStyleName(HupaCSS.C_msgview_container);
+        
+        buttonsBar.add(replyMsgButton);
+        buttonsBar.add(replyAllMsgButton);
+        buttonsBar.add(deleteMsgButton);
+        buttonsBar.add(forwardMsgButton);
+        buttonsBar.add(loading);
+        buttonsBar.add(showRawButton);
+        buttonsBar.add(backButton);
+        
+        ScrollPanel scrollPanel = new ScrollPanel();
+        scrollPanel.addStyleName(HupaCSS.C_msgview_content);
+        scrollPanel.setAlwaysShowScrollBars(false);
+        scrollPanel.add(msgArea);
+        
+        messageContainer.add(headers);
+        messageContainer.add(buttonsBar);
+        messageContainer.add(scrollPanel);
+        
+        loading.hide();
+        
+        initWidget(messageContainer);
+    }
+
+    public Widget asWidget() {
+        return this;
+    }
+
+    public void startProcessing() {
+        loading.show();
+    }
+
+    public void stopProcessing() {
+        loading.show();
+    }
+
+    public HasClickHandlers getDeleteButtonClick() {
+        return deleteMsgButton;
+    }
+
+    public void setAttachments(List<MessageAttachment> attachements,
+            final String folder,
+            final long uid) {
+        
+        attachments.clear();
+        final Element downloadIframe = RootPanel.get("__download").getElement();
+        if (attachements != null) {
+            for (final MessageAttachment messageAttachment : attachements) {
+                Label link = new Label(messageAttachment.getName() + " (" + messageAttachment.getSize() / 1024 + "kB)");
+                link.setStyleName(HupaCSS.C_hyperlink);
+                link.addClickHandler(new ClickHandler() {
+                    public void onClick(ClickEvent event) {
+                        String url = GWT.getModuleBaseURL() + SConsts.SERVLET_DOWNLOAD 
+                                    + "?" + SConsts.PARAM_NAME + "=" + messageAttachment.getName() 
+                                    + "&" + SConsts.PARAM_FOLDER + "=" + folder
+                                    + "&" + SConsts.PARAM_UID + "=" + uid;
+                        if (downloadIframe == null)
+                            Window.open(url,"_blank", "");
+                        else
+                            DOM.setElementAttribute(downloadIframe, "src", url);
+                    }
+                });
+                HorizontalPanel aPanel = new HorizontalPanel();
+                aPanel.addStyleName(HupaCSS.C_attachment);
+                aPanel.add(new Image(imageBundle.attachmentIcon()));
+                aPanel.add(link);
+                attachments.add(aPanel);
+            }
+        }
+    }
+
+    public HasClickHandlers getForwardButtonClick() {
+        return forwardMsgButton;
+    }
+
+    public HasClickHandlers getReplyAllButtonClick() {
+        return replyAllMsgButton;
+    }
+
+    public HasClickHandlers getReplyButtonClick() {
+        return replyMsgButton;
+    }
+
+    public HasClickHandlers getBackButtonClick() {
+        return backButton;
+    }
+
+    public HasClickHandlers getShowRawMessageClick() {
+        return showRawButton;
+    }
+
+    public void setHeaders(Message message) {
+        from.setText(message.getFrom());
+        cc.setText(Util.listToString(message.getCc()));
+        to.setText(Util.listToString(message.getTo()));
+        subject.setText(message.getSubject());
+        headers.setValues(from, to, cc, null, subject, attachments);
+    }
+    
+    public void setContent(String content) {
+        msgArea.setHTML(content);
+    }
+    
+}

Added: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/LoginPresenter.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/LoginPresenter.java?rev=1516205&view=auto
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/LoginPresenter.java (added)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/LoginPresenter.java Wed Aug 21 16:35:16 2013
@@ -0,0 +1,141 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.hupa.client.mvp;
+
+import net.customware.gwt.dispatch.client.DispatchAsync;
+import net.customware.gwt.presenter.client.EventBus;
+import net.customware.gwt.presenter.client.widget.WidgetDisplay;
+import net.customware.gwt.presenter.client.widget.WidgetPresenter;
+
+import org.apache.hupa.client.HupaCallback;
+import org.apache.hupa.client.HupaConstants;
+import org.apache.hupa.shared.events.FlashEvent;
+import org.apache.hupa.shared.events.LoginEvent;
+import org.apache.hupa.shared.events.SessionExpireEvent;
+import org.apache.hupa.shared.events.SessionExpireEventHandler;
+import org.apache.hupa.shared.rpc.LoginUser;
+import org.apache.hupa.shared.rpc.LoginUserResult;
+
+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.user.client.ui.Focusable;
+import com.google.gwt.user.client.ui.HasValue;
+import com.google.inject.Inject;
+
+/**
+ * Presenter which handles the Login of and user to the IMAP-Server
+ * 
+ *
+ */
+public class LoginPresenter extends WidgetPresenter<LoginPresenter.Display>{
+    
+    private HupaConstants constants = GWT.create(HupaConstants.class);
+    private int minUsernameLength = 1;
+    private int minPasswordLength = 1;
+
+    public interface Display extends WidgetDisplay{
+        public HasClickHandlers getLoginClick();
+        public HasClickHandlers getResetClick();
+        public HasValue<String> getUserNameValue();
+        public HasValue<String> getPasswordValue();
+        public Focusable getUserNameFocus();
+        public void setLoading(boolean loading);
+    }
+    
+    private DispatchAsync dispatcher;
+
+    @Inject
+    public LoginPresenter(LoginPresenter.Display display,EventBus bus,DispatchAsync dispatcher) {
+        super(display,bus);
+        this.dispatcher = dispatcher;
+    }
+    
+    /**
+     * Try to login the user
+     */
+    private void doLogin() {
+        String user = display.getUserNameValue().getValue();
+        String pass = display.getPasswordValue().getValue();
+        
+        if (user.length() < minUsernameLength || pass.length() < minPasswordLength)
+            return;
+        
+        display.setLoading(true);
+        dispatcher.execute(new LoginUser(user, pass), new HupaCallback<LoginUserResult>(dispatcher, eventBus, display) {
+            public void callback(LoginUserResult result) {
+                display.setLoading(false);
+                eventBus.fireEvent(new LoginEvent(result.getUser()));
+                doReset();
+            }
+            public void callbackError(Throwable caught) {
+                display.setLoading(false);
+                eventBus.fireEvent(new FlashEvent(constants.loginInvalid(), 4000));
+                doReset();
+            }
+        }); 
+    }
+    
+    /**
+     * Reset display
+     */
+    private void doReset() {
+        display.getUserNameValue().setValue("");
+        display.getPasswordValue().setValue("");
+        display.getUserNameFocus().setFocus(true);
+    }
+
+    @Override
+    protected void onBind() {
+        registerHandler(display.getLoginClick().addClickHandler(new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                doLogin();
+            }
+            
+        }));
+        registerHandler(display.getResetClick().addClickHandler(new ClickHandler() {
+
+            public void onClick(ClickEvent event) {
+                doReset();
+            }
+            
+        }));
+        
+        registerHandler(eventBus.addHandler(SessionExpireEvent.TYPE, new SessionExpireEventHandler() {
+
+            public void onSessionExpireEvent(SessionExpireEvent event) {
+                eventBus.fireEvent(new FlashEvent(constants.sessionTimedOut(), 4000));
+            }
+            
+        }));
+    }
+
+    @Override
+    protected void onUnbind() {
+        // Nothing to do
+    }
+
+    @Override
+    protected void onRevealDisplay() {
+        // Nothing to do
+    }
+}

Added: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/LoginView.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/LoginView.java?rev=1516205&view=auto
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/LoginView.java (added)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mvp/LoginView.java Wed Aug 21 16:35:16 2013
@@ -0,0 +1,182 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.hupa.client.mvp;
+
+import org.apache.hupa.client.HupaCSS;
+import org.apache.hupa.client.HupaConstants;
+import org.apache.hupa.widgets.ui.Loading;
+import org.apache.hupa.widgets.ui.RndPanel;
+import org.cobogw.gwt.user.client.ui.Button;
+import org.cobogw.gwt.user.client.ui.ButtonBar;
+
+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.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.FlexTable;
+import com.google.gwt.user.client.ui.Focusable;
+import com.google.gwt.user.client.ui.HasValue;
+import com.google.gwt.user.client.ui.PasswordTextBox;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.user.client.ui.VerticalPanel;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.inject.Inject;
+
+/**
+ * View which shows the Login from
+ *
+ */
+public class LoginView extends Composite implements KeyUpHandler,LoginPresenter.Display{
+    
+    private Button loginButton;
+    private Button resetButton;
+    private TextBox usernameTextBox = new TextBox();
+    private PasswordTextBox passwordTextBox = new PasswordTextBox();
+    private Loading loading;
+    @Inject
+    public LoginView(HupaConstants constants) {
+        
+        VerticalPanel mainContainer = new VerticalPanel();
+        RndPanel rPanel = new RndPanel();
+        FlexTable formPanel = new FlexTable();
+        ButtonBar buttonBar = new ButtonBar();
+        loginButton = new Button(constants.loginButton());
+        resetButton = new Button(constants.resetButton());  
+        loading = new Loading(constants.loading());
+        
+        mainContainer.setStyleName(HupaCSS.C_login_container);
+        formPanel.addStyleName(HupaCSS.C_login_form);
+        usernameTextBox.addStyleName(HupaCSS.C_login_box);
+        passwordTextBox.addStyleName(HupaCSS.C_login_box);
+        
+        buttonBar.add(loginButton);
+        buttonBar.add(resetButton);
+
+        formPanel.setText(0, 0, constants.usernameLabel());
+        formPanel.setWidget(0, 1, usernameTextBox);
+        formPanel.setText(1, 0, constants.passwordLabel());
+        formPanel.setWidget(1, 1, passwordTextBox);
+        formPanel.getFlexCellFormatter().setColSpan(2, 0, 2);
+        formPanel.setWidget(2, 0, buttonBar);
+
+        rPanel.add(formPanel);
+        mainContainer.add(rPanel);
+        mainContainer.add(loading);
+        initWidget(mainContainer);
+        
+        usernameTextBox.addKeyUpHandler(this);
+        usernameTextBox.setFocus(true);
+        passwordTextBox.addKeyUpHandler(this);
+
+        loading.hide();
+    }
+    
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * com.google.gwt.event.dom.client.KeyUpHandler#onKeyUp(com.google.gwt.event
+     * .dom.client.KeyUpEvent)
+     */
+    public void onKeyUp(KeyUpEvent event) {
+        if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
+            if (event.getSource().equals(usernameTextBox)) {
+                passwordTextBox.setFocus(true);
+            }  else if (event.getSource().equals(passwordTextBox)) {
+                loginButton.click();
+            }
+        }
+    }
+ 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.LoginPresenter.Display#getLoginClick()
+     */
+    public HasClickHandlers getLoginClick() {
+        return loginButton;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.LoginPresenter.Display#getPasswordValue()
+     */
+    public HasValue<String> getPasswordValue() {
+        return passwordTextBox;
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.LoginPresenter.Display#getResetClick()
+     */
+    public HasClickHandlers getResetClick() {
+        return resetButton;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.LoginPresenter.Display#getUserNameValue()
+     */
+    public HasValue<String> getUserNameValue() {
+        return usernameTextBox;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.mvp.LoginPresenter.Display#getUserNameFocus()
+     */
+    public Focusable getUserNameFocus() {
+        return usernameTextBox;
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see net.customware.gwt.presenter.client.widget.WidgetDisplay#asWidget()
+     */
+    public Widget asWidget() {
+        return this;
+    }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.hupa.client.HupaWidgetDisplay#startProcessing()
+     */
+    public void setLoading(boolean load) {
+        if (load) {
+            loading.show();
+        } else {
+            loading.hide();
+
+        }
+    }
+    
+    /* (non-Javadoc)
+     * @see com.google.gwt.user.client.ui.Composite#onAttach()
+     */
+    @Override
+    public void onAttach() {
+       super.onAttach();
+       usernameTextBox.setFocus(true);
+    }
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org