diff --git a/.settings/com.gwtplugins.gdt.eclipse.core.prefs b/.settings/com.gwtplugins.gdt.eclipse.core.prefs index f521e97..e2ceb1d 100644 --- a/.settings/com.gwtplugins.gdt.eclipse.core.prefs +++ b/.settings/com.gwtplugins.gdt.eclipse.core.prefs @@ -1,4 +1,5 @@ eclipse.preferences.version=1 lastWarOutDir=${webappDirectory} +launchConfigExternalUrlPrefix= warSrcDir=src/main/webapp warSrcDirIsOutput=false diff --git a/pom.xml b/pom.xml index 503cb62..2067a18 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ 1.8 1.8 - 2.1.1 + 2.0.1 UTF-8 diff --git a/src/main/java/org/gcube/portets/user/message_conversations/client/autocomplete/MaterialAutoComplete.java b/src/main/java/org/gcube/portets/user/message_conversations/client/autocomplete/MaterialAutoComplete.java index 3654d31..d171d2d 100644 --- a/src/main/java/org/gcube/portets/user/message_conversations/client/autocomplete/MaterialAutoComplete.java +++ b/src/main/java/org/gcube/portets/user/message_conversations/client/autocomplete/MaterialAutoComplete.java @@ -1,18 +1,49 @@ package org.gcube.portets.user.message_conversations.client.autocomplete; +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + import com.google.gwt.dom.client.Document; -import com.google.gwt.event.dom.client.*; -import com.google.gwt.event.logical.shared.*; +import com.google.gwt.event.dom.client.BlurEvent; +import com.google.gwt.event.dom.client.BlurHandler; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.FocusEvent; +import com.google.gwt.event.dom.client.FocusHandler; +import com.google.gwt.event.dom.client.KeyCodes; +import com.google.gwt.event.dom.client.KeyUpHandler; +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.event.logical.shared.ValueChangeEvent; +import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.DOM; -import com.google.gwt.user.client.ui.*; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.SuggestBox; +import com.google.gwt.user.client.ui.SuggestOracle; import com.google.gwt.user.client.ui.SuggestOracle.Suggestion; +import com.google.gwt.user.client.ui.TextBox; +import com.google.gwt.user.client.ui.Widget; + import gwt.material.design.addins.client.MaterialAddins; import gwt.material.design.addins.client.autocomplete.constants.AutocompleteType; import gwt.material.design.addins.client.base.constants.AddinsCssName; import gwt.material.design.client.MaterialDesignBase; -import gwt.material.design.client.base.*; -import gwt.material.design.client.base.mixin.*; +import gwt.material.design.client.base.AbstractValueWidget; +import gwt.material.design.client.base.HasPlaceholder; +import gwt.material.design.client.base.HasProgress; +import gwt.material.design.client.base.HasReadOnly; +import gwt.material.design.client.base.HasType; +import gwt.material.design.client.base.MaterialWidget; +import gwt.material.design.client.base.mixin.CssTypeMixin; +import gwt.material.design.client.base.mixin.FocusableMixin; +import gwt.material.design.client.base.mixin.ProgressMixin; +import gwt.material.design.client.base.mixin.ReadOnlyMixin; import gwt.material.design.client.constants.CssName; import gwt.material.design.client.constants.IconType; import gwt.material.design.client.constants.ProgressType; @@ -23,9 +54,6 @@ import gwt.material.design.client.ui.html.Label; import gwt.material.design.client.ui.html.ListItem; import gwt.material.design.client.ui.html.UnorderedList; -import java.util.*; -import java.util.Map.Entry; - /** * * @author kevzlou7979 @@ -283,7 +311,7 @@ public class MaterialAutoComplete extends AbstractValueWidget sentCellList; + + MessageProvider mp; + + DataSource dataSource = new MessageDataSource(false, convService); + //InfiniteScrollView scrollView = new InfiniteScrollView(dataSource); private ConvMessage currentSelected; private DisplayMessage displayMessage; private WriteMessage newMessageDisplay; private boolean isSendTo = false; + public ApplicationView(String... sendToUserNames) { initWidget(uiBinder.createAndBindUi(this)); ((ServiceDefTarget) convService).setServiceEntryPoint(Utils.getServiceEntryPoint()); @@ -128,27 +148,96 @@ public class ApplicationView extends Composite { isSendTo = true; messageLoader.setVisible(false); } - readUserMessages(false, isSendTo); - infiniteScrollBasic.setLoadConfig(new LoadConfig<>(0, 200)); - infiniteScrollBasic.setDataSource(new MessageDataSource(false, convService)); - infiniteScrollBasic.setRenderer(model -> createColumn(model)); - messageLoader.setVisible(false); - infiniteScrollBasic.setVisible(true); + + GWT.log("application initialized"); + + sentCellList = new CellTable(ConvMessage.KEY_PROVIDER); + sentCellList.setPageSize(100); + sentCellList.setKeyboardPagingPolicy(KeyboardPagingPolicy.INCREASE_RANGE); + sentCellList.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.BOUND_TO_SELECTION); + sentCellList.setWidth("100%", false); + + + + readUserMessages(false, isSendTo); + } - protected MessageItem createColumn(ConvMessage m) { - return new MessageItem(m , this, isSendTo); - } + /** + * Add the columns to the table. + */ + private void initTableColumns(CellTable cellTable + ,final SelectionModel selectionModel /*, + ListHandler sortHandler*/) { + // Checkbox column. This table will uses a checkbox column for selection. + // Alternatively, you can call cellTable.setSelectionEnabled(true) to enable + // mouse selection. + + cellTable.setRowStyles(new RowStyles() { + + @Override + public String getStyleNames(ConvMessage row, int rowIndex) { + if (row.isRead()) + return "{style.read}"; + else return ""; + } + }); + Column checkColumn = new Column( + new CheckboxCell(true, false)) { + @Override + public Boolean getValue(ConvMessage object) { + // Get the value from the selection model. + return selectionModel.isSelected(object); + //return false; + } + }; + cellTable.addColumn(checkColumn, SafeHtmlUtils.fromSafeConstant("
")); + cellTable.setColumnWidth(checkColumn, 80, Unit.PX); - } + // From. + Column fromColumn = new Column( + new TextCell()) { + @Override + public String getValue(ConvMessage object) { + return object.getOwner().getFullName(); + } + }; + + cellTable.addColumn(fromColumn, "From"); + cellTable.setColumnWidth(fromColumn, 40, Unit.PCT); + + // Subject. + Column subjectColumn = new Column( + new TextCell()) { + @Override + public String getValue(ConvMessage object) { + return object.getSubject(); + } + }; + cellTable.addColumn(subjectColumn, "Subject"); + cellTable.setColumnWidth(subjectColumn, 200, Unit.PCT); + + // date. + Column dateColumn = new Column( + new TextCell()) { + @Override + public String getValue(ConvMessage object) { + return Utils.getFormatteDate(object.getDate()); + } + }; + cellTable.addColumn(dateColumn, "Date"); + cellTable.setColumnWidth(subjectColumn, 20, Unit.PCT); + + } + /** * * @param sent * + **/ public void readUserMessages(final boolean sent, boolean isSendTo) { - messagesLoader.setVisible(true); convService.getMessages(sent, new AsyncCallback>() { @Override public void onFailure(Throwable arg0) { @@ -158,55 +247,35 @@ public class ApplicationView extends Composite { @Override public void onSuccess(ArrayList messages) { if (messages != null) { - showMessages(messages, sent); - if (!isSendTo) { - if (messages.size() > 0) - readUserMessage(messages.get(0).getId(), sent); - else { - writeWelcomeMessage(); - messageLoader.setVisible(false); - } - } + totalMessages = messages.size(); + mp = new MessageProvider(messages); + mp.addDataDisplay(sentCellList); + + // Add a selection model so we can select cells. + final SelectionModel selectionModel = new MultiSelectionModel(ConvMessage.KEY_PROVIDER); + sentCellList.setSelectionModel(selectionModel, + DefaultSelectionEventManager. createCheckboxManager()); + + + initTableColumns(sentCellList, selectionModel); + + pagerPanel.setDisplay(sentCellList); + pagerPanel.setIncrementSize(50); + messageLoader.setVisible(false); + readUserMessage(mp.getDataProvider().getList().get(0).getId(), sent); } else { showErrorOccurred(); } } }); - }*/ - - + } + private void showErrorOccurred() { - messagesCollection.clear(); - messagesLoader.setVisible(false); + //messagesCollection.clear(); messageLoader.setVisible(false); hideSidePanel(); writeErrorMessage(); } - /** - * - * @param messages - * @param sent - */ - public void showMessages(ArrayList messages, boolean sent) { - messagesCollection.clear(); - messagesLoader.setVisible(false); - messagesCollection.setVisible(true); - int scrollerHeight = Window.getClientHeight() - 100; - scrollerPanel.setHeight(scrollerHeight+"px"); - for (ConvMessage convMessage : messages) { - messagesCollection.add(new MessageItem(convMessage, messagesCollection, this, sent)); - if (! (sent || convMessage.isRead())) - unreadMessages++; - totalMessages++; - } - if (messages.size() > 0) { - MessageItem first = (MessageItem) messagesCollection.getChildrenList().get(0); - first.setSelected(true); - } else { - - } - updateBadge(sent); - } /** * * @param sent @@ -261,7 +330,7 @@ public class ApplicationView extends Composite { displayMessage(messageId, sent); } } - + private void displayMessage(String messageId, final boolean sent) { messageLoader.setColor(Utils.getRandomColor()); messageLoader.setVisible(true); @@ -285,7 +354,7 @@ public class ApplicationView extends Composite { } }); } - + private void updateBadge(boolean sent) { String badgeText = totalMessages + (sent ? " sent" : " (" + unreadMessages + " unread" + ")"); if (unreadMessages == 0 && !sent) @@ -337,7 +406,7 @@ public class ApplicationView extends Composite { private void displayNewOrReplyMessage() { WRITING_MESSAGE = true; FAB.setVisible(false); - messagesCollection.clearActive(); + //messagesCollection.clearActive(); scrollerPanel.clear(); scrollerPanel.add(newMessageDisplay); newMessageDisplay.setFocusOnUsersInput(); @@ -398,7 +467,6 @@ public class ApplicationView extends Composite { displayMessage.getMainPanel().setGrid("l8 m12 s12"); newMessageDisplay.getMainPanel().setLeft(350); newMessageDisplay.getMainPanel().setGrid("l8 m12 s12"); - rightPanel.setLeft(0); toggle = ! toggle; } @@ -408,7 +476,6 @@ public class ApplicationView extends Composite { newMessageDisplay.getMainPanel().setLeft(0); newMessageDisplay.getMainPanel().setGrid("l12 s12 m12"); - rightPanel.setLeft(-350); toggle = ! toggle; } @@ -425,9 +492,9 @@ public class ApplicationView extends Composite { FAB.setVisible(false); displayMessage.showMessage(welcomeMessage); welcomeMessage.setContent(MessagesResources.WELCOME_MESSAGE.substring(0, 102)+ " ..."); - MessageItem item = new MessageItem(welcomeMessage, messagesCollection, this, false); - item.hideMessageMenu(); - messagesCollection.add(item); + MessageItem item = new MessageItem(welcomeMessage, false); + //item.hideMessageMenu(); + //messagesCollection.add(item); totalMessages++; updateBadge(false); } @@ -441,9 +508,9 @@ public class ApplicationView extends Composite { FAB.setVisible(false); displayMessage.showMessage(welcomeMessage); welcomeMessage.setContent(MessagesResources.ERROR_MESSAGE.substring(0, 102)+ " ..."); - MessageItem item = new MessageItem(welcomeMessage, messagesCollection, this, false); - item.hideMessageMenu(); - messagesCollection.add(item); + MessageItem item = new MessageItem(welcomeMessage, false); + //item.hideMessageMenu(); + //messagesCollection.add(item); totalMessages++; updateBadge(false); } diff --git a/src/main/java/org/gcube/portets/user/message_conversations/client/ui/ApplicationView.ui.xml b/src/main/java/org/gcube/portets/user/message_conversations/client/ui/ApplicationView.ui.xml index a13f8de..c6fb72c 100755 --- a/src/main/java/org/gcube/portets/user/message_conversations/client/ui/ApplicationView.ui.xml +++ b/src/main/java/org/gcube/portets/user/message_conversations/client/ui/ApplicationView.ui.xml @@ -1,8 +1,9 @@ + xmlns:s="urn:import:org.gcube.portets.user.message_conversations.client.ui"> .animation { @@ -22,14 +23,17 @@ } .marginTop { - margin-top: 0px; - min-height: 850px; + margin-top: 60px; } .overflowXHidden { overflow-x: hidden !important; /* needed in windows */ } + .read { + font-weight: bold; font-style: italic; + } + .modalTitle { font-size: 2em; } @@ -39,63 +43,61 @@ padding: 50px; } - + - - - - - - + + + + + showOn="SHOW_ON_MED_DOWN" iconType="MESSAGE" + textColor="LIGHT_BLUE_DARKEN_2" waves="LIGHT" /> - - - - - - - - - - - - - - - - - + +
+ + + + + + + + + + + + +
- + + waves="LIGHT" backgroundColor="BLUE" ui:field="forward" + iconType="FORWARD" /> + waves="LIGHT" backgroundColor="AMBER" ui:field="replyAll" + iconType="REPLY_ALL" /> + waves="LIGHT" backgroundColor="TEAL" ui:field="reply" + iconType="REPLY" />
diff --git a/src/main/java/org/gcube/portets/user/message_conversations/client/ui/MessageDataSource.java b/src/main/java/org/gcube/portets/user/message_conversations/client/ui/MessageDataSource.java index 2ad4a76..abc5b59 100644 --- a/src/main/java/org/gcube/portets/user/message_conversations/client/ui/MessageDataSource.java +++ b/src/main/java/org/gcube/portets/user/message_conversations/client/ui/MessageDataSource.java @@ -7,10 +7,11 @@ import org.gcube.portets.user.message_conversations.shared.MessagesWindow; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.rpc.AsyncCallback; -import gwt.material.design.incubator.client.infinitescroll.data.DataSource; -import gwt.material.design.incubator.client.infinitescroll.data.LoadCallback; -import gwt.material.design.incubator.client.infinitescroll.data.LoadConfig; -import gwt.material.design.incubator.client.infinitescroll.data.LoadResult; +import gwt.material.design.client.data.DataSource; +import gwt.material.design.client.data.loader.LoadCallback; +import gwt.material.design.client.data.loader.LoadConfig; +import gwt.material.design.client.data.loader.LoadResult; + public class MessageDataSource implements DataSource { @@ -23,6 +24,7 @@ public class MessageDataSource implements DataSource { } + @Override public void load(LoadConfig loadConfig, LoadCallback callback) { @@ -30,7 +32,7 @@ public class MessageDataSource implements DataSource { new AsyncCallback() { @Override public void onSuccess(MessagesWindow messages) { - callback.onSuccess(new LoadResult(messages.getMessages(), loadConfig.getOffset(), messages.getTotal())); + callback.onSuccess(new LoadResult<>(messages.getMessages(), loadConfig.getOffset(), messages.getTotal())); } @Override @@ -41,4 +43,16 @@ public class MessageDataSource implements DataSource { }); } + + + + + + + @Override + public boolean useRemoteSort() { + // TODO Auto-generated method stub + return false; + } + } diff --git a/src/main/java/org/gcube/portets/user/message_conversations/client/ui/MessageItem.java b/src/main/java/org/gcube/portets/user/message_conversations/client/ui/MessageItem.java index 1e65605..92bcb27 100644 --- a/src/main/java/org/gcube/portets/user/message_conversations/client/ui/MessageItem.java +++ b/src/main/java/org/gcube/portets/user/message_conversations/client/ui/MessageItem.java @@ -23,7 +23,6 @@ import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; import gwt.material.design.client.constants.Color; -import gwt.material.design.client.ui.MaterialCollection; import gwt.material.design.client.ui.MaterialCollectionItem; import gwt.material.design.client.ui.MaterialDropDown; import gwt.material.design.client.ui.MaterialIcon; @@ -43,8 +42,6 @@ public class MessageItem extends Composite { private boolean deleteClicked = true; - private ApplicationView ap; - private MaterialCollection parentCollection; private ConvMessage myMessage; private boolean sent; @@ -64,13 +61,12 @@ public class MessageItem extends Composite { MessagesResources images = GWT.create(MessagesResources.class); - public MessageItem(final ConvMessage m, MaterialCollection parentCollection, ApplicationView ap, boolean sent) { + public MessageItem(final ConvMessage m, boolean sent) { initWidget(uiBinder.createAndBindUi(this)); item.getElement().getStyle().setCursor(Cursor.POINTER); this.sent = sent; this.myMessage = m; - this.ap = ap; - this.parentCollection = parentCollection; + //this.parentCollection = parentCollection; if (m.hasAttachments()) attachmentsIcon.setVisibility(Visibility.VISIBLE); if (!sent && !m.isRead()) @@ -128,7 +124,7 @@ public class MessageItem extends Composite { event.stopPropagation(); } }); - +/* deleteButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { @@ -145,26 +141,14 @@ public class MessageItem extends Composite { new MaterialToast(()->{doDelete(m.getSubject());}, link).toast("Deleting Message ("+m.getSubject()+")"); item.setVisible(false); } - }); + }); */ dd.getElement().getStyle().setWidth(300, Unit.PX); String activator = "activate"+Random.nextInt(); dd.setActivator(activator); messageActionIcon.setActivates(activator); } - - @UiHandler("setUnreadButton") - void onSetUnread(ClickEvent e) { - e.stopPropagation(); - if (myMessage.isRead()) { - ap.setMessageUnread(myMessage, this.sent); - myMessage.setRead(false); - item.addStyleName("unread-message"); - } else { - Window.alert("Message is marked as unread already."); - } - } - +/* private void doDelete(String subject) { if (deleteClicked) { ap.deleteMessage(myMessage, this.sent); @@ -172,7 +156,8 @@ public class MessageItem extends Composite { else deleteClicked = true; } - +*/ + public void setSelected(boolean active) { item.setBackgroundColor(Color.WHITE); item.removeStyleName("unread-message"); @@ -180,22 +165,14 @@ public class MessageItem extends Composite { myMessage.setRead(true); } +/* @UiHandler("item") void onClickedMessage(ClickEvent e) { checkHideSideBarOnMobile(); - parentCollection.clearActive(); + //parentCollection.clearActive(); ap.readUserMessage(myMessage.getId(), this.sent); setSelected(true); myMessage.setRead(true); } - - private void checkHideSideBarOnMobile() { - if (Utils.isMobile()) - ap.hideSidePanel(); - } - - public void hideMessageMenu() { - messageActionIcon.setVisible(false); - } - +*/ } diff --git a/src/main/java/org/gcube/portets/user/message_conversations/client/ui/MessageProvider.java b/src/main/java/org/gcube/portets/user/message_conversations/client/ui/MessageProvider.java new file mode 100644 index 0000000..93e2868 --- /dev/null +++ b/src/main/java/org/gcube/portets/user/message_conversations/client/ui/MessageProvider.java @@ -0,0 +1,79 @@ +package org.gcube.portets.user.message_conversations.client.ui; + +import java.util.List; + +import org.gcube.portets.user.message_conversations.shared.ConvMessage; + +import com.google.gwt.view.client.HasData; +import com.google.gwt.view.client.ListDataProvider; + +/** + * The data source for contact information used in the sample. + */ +public class MessageProvider { + + /** + * The singleton instance of the database. + + private static MessageProvider instance; + + + * Get the singleton instance of the contact database. + * + * @return the singleton instance + + public static MessageProvider get() { + if (instance == null) { + instance = new MessageProvider(); + } + return instance; + } */ + + /** + * The provider that holds the list of contacts in the database. + */ + private ListDataProvider dataProvider = new ListDataProvider(); + + + public MessageProvider(List messages) { + List contacts = dataProvider.getList(); + contacts.addAll(messages); + } + + /** + * Add a new contact. + * + * @param contact the contact to add. + */ + public void addMessage(ConvMessage message) { + List contacts = dataProvider.getList(); + // Remove the contact first so we don't add a duplicate. + contacts.remove(message); + contacts.add(message); + } + + /** + * Add a display to the database. The current range of interest of the display + * will be populated with data. + * + * @param display a {@Link HasData}. + */ + public void addDataDisplay(HasData display) { + dataProvider.addDataDisplay(display); + } + + + public ListDataProvider getDataProvider() { + return dataProvider; + } + + + /** + * Refresh all displays. + */ + public void refreshDisplays() { + dataProvider.refresh(); + } + + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portets/user/message_conversations/client/ui/ShowMorePagerPanel.java b/src/main/java/org/gcube/portets/user/message_conversations/client/ui/ShowMorePagerPanel.java new file mode 100644 index 0000000..d851ff4 --- /dev/null +++ b/src/main/java/org/gcube/portets/user/message_conversations/client/ui/ShowMorePagerPanel.java @@ -0,0 +1,105 @@ +package org.gcube.portets.user.message_conversations.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ScrollEvent; +import com.google.gwt.event.dom.client.ScrollHandler; +import com.google.gwt.user.cellview.client.AbstractPager; +import com.google.gwt.user.client.ui.ScrollPanel; +import com.google.gwt.user.client.ui.Widget; +import com.google.gwt.view.client.HasRows; + +/** + * A scrolling pager that automatically increases the range every time the + * scroll bar reaches the bottom. + */ +public class ShowMorePagerPanel extends AbstractPager { + + /** + * The default increment size. + */ + private static final int DEFAULT_INCREMENT = 20; + + /** + * The increment size. + */ + private int incrementSize = DEFAULT_INCREMENT; + + /** + * The last scroll position. + */ + private int lastScrollPos = 0; + + /** + * The scrollable panel. + */ + private final ScrollPanel scrollable = new ScrollPanel(); + + /** + * Construct a new {@link ShowMorePagerPanel}. + */ + public ShowMorePagerPanel() { + initWidget(scrollable); + + // Do not let the scrollable take tab focus. + scrollable.getElement().setTabIndex(-1); + + // Handle scroll events. + scrollable.addScrollHandler(new ScrollHandler() { + public void onScroll(ScrollEvent event) { + // If scrolling up, ignore the event. + int oldScrollPos = lastScrollPos; + lastScrollPos = scrollable.getVerticalScrollPosition(); + if (oldScrollPos >= lastScrollPos) { + return; + } + + HasRows display = getDisplay(); + if (display == null) { + return; + } + int maxScrollTop = scrollable.getWidget().getOffsetHeight() + - scrollable.getOffsetHeight(); + if (lastScrollPos >= maxScrollTop) { + // We are near the end, so increase the page size. + int newPageSize = Math.min( + display.getVisibleRange().getLength() + incrementSize, + display.getRowCount()); + display.setVisibleRange(0, newPageSize); + } + } + }); + } + + /** + * Get the number of rows by which the range is increased when the scrollbar + * reaches the bottom. + * + * @return the increment size + */ + public int getIncrementSize() { + return incrementSize; + } + + @Override + public void setDisplay(HasRows display) { + assert display instanceof Widget : "display must extend Widget"; + scrollable.setWidget((Widget) display); + super.setDisplay(display); + } + + /** + * Set the number of rows by which the range is increased when the scrollbar + * reaches the bottom. + * + * @param incrementSize the incremental number of rows + */ + public void setIncrementSize(int incrementSize) { + GWT.log("increment of "+ incrementSize); + this.incrementSize = incrementSize; + } + + @Override + protected void onRangeOrRowCountChanged() { + GWT.log("range changed ..."); + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portets/user/message_conversations/client/ui/WriteMessage.java b/src/main/java/org/gcube/portets/user/message_conversations/client/ui/WriteMessage.java index 07fa4ff..421e7eb 100644 --- a/src/main/java/org/gcube/portets/user/message_conversations/client/ui/WriteMessage.java +++ b/src/main/java/org/gcube/portets/user/message_conversations/client/ui/WriteMessage.java @@ -277,20 +277,20 @@ public class WriteMessage extends Composite { @UiHandler("btnSendModal") void onSendMessage(ClickEvent e) { if (getSelectedUsers().isEmpty()) { - acModal.setErrorText("Look empty to me"); + acModal.setError("Look empty to me"); return; } else { acModal.reset(); } if (txtBoxSubject.getText().isEmpty()) { - txtBoxSubject.setErrorText("Subject is mandatory"); + txtBoxSubject.setError("Subject is mandatory"); return; } else { txtBoxSubject.reset(); } if (txtArea.getText().isEmpty()) { - txtArea.setErrorText("The body of the message is mandatory"); + txtArea.setError("The body of the message is mandatory"); return; } else { diff --git a/src/main/java/org/gcube/portets/user/message_conversations/server/FakeConvServiceImpl.java b/src/main/java/org/gcube/portets/user/message_conversations/server/FakeConvServiceImpl.java index abaa4c6..fff3f8b 100644 --- a/src/main/java/org/gcube/portets/user/message_conversations/server/FakeConvServiceImpl.java +++ b/src/main/java/org/gcube/portets/user/message_conversations/server/FakeConvServiceImpl.java @@ -149,12 +149,13 @@ public class FakeConvServiceImpl extends RemoteServiceServlet implements Message @Override public MessagesWindow getMessagesWindows(boolean sent, int limit, int offset) { + _log.info("get Message Window called limit {} offset {}", limit, offset); if (sent) { List messages = sentMessages.subList(0, messageSentNumberToTest); - return new MessagesWindow(messages.size(), new ArrayList<>(sentMessages.subList(offset, limit))); + return new MessagesWindow(messages.size(), new ArrayList<>(messages.subList(offset, offset+limit))); } else { List messages = receivedMessages.subList(0, messageReceivedNumberToTest); - return new MessagesWindow(messages.size(), new ArrayList<>(receivedMessages.subList(offset, limit))); + return new MessagesWindow(messages.size(), new ArrayList<>(messages.subList(offset, offset+limit))); } } diff --git a/src/main/java/org/gcube/portets/user/message_conversations/shared/ConvMessage.java b/src/main/java/org/gcube/portets/user/message_conversations/shared/ConvMessage.java index 5bae0e2..5755b18 100644 --- a/src/main/java/org/gcube/portets/user/message_conversations/shared/ConvMessage.java +++ b/src/main/java/org/gcube/portets/user/message_conversations/shared/ConvMessage.java @@ -5,6 +5,7 @@ import java.util.Date; import java.util.List; import com.google.gwt.user.client.rpc.IsSerializable; +import com.google.gwt.view.client.ProvidesKey; public class ConvMessage implements IsSerializable{ @@ -17,7 +18,15 @@ public class ConvMessage implements IsSerializable{ private boolean isRead; private ArrayList attachments; private boolean hasAttachments; - + + + public static final ProvidesKey KEY_PROVIDER = new ProvidesKey() { + @Override + public Object getKey(ConvMessage item) { + return item == null ? null : item.getId(); + } + }; + public ConvMessage() { super(); } @@ -54,8 +63,8 @@ public class ConvMessage implements IsSerializable{ this.hasAttachments = hasAttachments; } - - + + public ConvMessage(String id, String subject, MessageUserModel owner, List recipients, Date date, String content, boolean isRead, boolean hasAttachments) { super(); @@ -157,8 +166,30 @@ public class ConvMessage implements IsSerializable{ } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } - - + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ConvMessage other = (ConvMessage) obj; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + return true; + } + } diff --git a/src/main/resources/org/gcube/portets/user/message_conversations/MessageConversations.gwt.xml b/src/main/resources/org/gcube/portets/user/message_conversations/MessageConversations.gwt.xml index 467587c..997c81c 100644 --- a/src/main/resources/org/gcube/portets/user/message_conversations/MessageConversations.gwt.xml +++ b/src/main/resources/org/gcube/portets/user/message_conversations/MessageConversations.gwt.xml @@ -3,6 +3,7 @@ + @@ -14,11 +15,6 @@ - - - - -