/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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.ext.uberfire.social.activities.client.widgets.timeline.simple; 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.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Widget; import org.ext.uberfire.social.activities.client.resources.i18n.Constants; import org.ext.uberfire.social.activities.client.widgets.item.SimpleItemWidget; import org.ext.uberfire.social.activities.client.widgets.item.bundle.SocialBundleHelper; import org.ext.uberfire.social.activities.client.widgets.item.model.SimpleItemWidgetModel; import org.ext.uberfire.social.activities.client.widgets.pagination.Pager; import org.ext.uberfire.social.activities.client.widgets.timeline.simple.model.SimpleSocialTimelineWidgetModel; import org.ext.uberfire.social.activities.model.PagedSocialQuery; import org.ext.uberfire.social.activities.model.SocialActivitiesEvent; import org.ext.uberfire.social.activities.service.SocialTypeTimelinePagedRepositoryAPI; import org.ext.uberfire.social.activities.service.SocialUserTimelinePagedRepositoryAPI; import org.gwtbootstrap3.client.ui.MediaList; import org.gwtbootstrap3.client.ui.html.Paragraph; import org.jboss.errai.bus.client.api.base.MessageBuilder; import org.jboss.errai.common.client.api.RemoteCallback; import org.uberfire.backend.vfs.Path; import org.uberfire.backend.vfs.VFSService; public class SimpleSocialTimelineWidget extends Composite { static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); @UiField MediaList itemsPanel; @UiField FlowPanel pagination; private SimpleSocialTimelineWidgetModel model; public SimpleSocialTimelineWidget(SimpleSocialTimelineWidgetModel model) { initWidget(uiBinder.createAndBindUi(this)); this.model = model; setupPaginationLinks(); refreshTimelineWidget(); } private void refreshTimelineWidget() { itemsPanel.clear(); createWidgets(); } private void createWidgets() { pagination.clear(); if (model.isSocialTypeWidget()) { createSociaTypelItemsWidget(); } else { createUserTimelineItemsWidget(); } } private void createUserTimelineItemsWidget() { MessageBuilder.createCall(new RemoteCallback<PagedSocialQuery>() { public void callback(PagedSocialQuery paged) { createTimeline(paged); } }, SocialUserTimelinePagedRepositoryAPI.class).getUserTimeline(model.getSocialUser(), model.getSocialPaged(), model.getPredicate()); } private void createSociaTypelItemsWidget() { MessageBuilder.createCall(new RemoteCallback<PagedSocialQuery>() { public void callback(PagedSocialQuery paged) { createTimeline(paged); } }, SocialTypeTimelinePagedRepositoryAPI.class).getEventTimeline(model.getSocialEventType().name(), model.getSocialPaged(), model.getPredicate()); } private void createTimeline(PagedSocialQuery paged) { if (thereIsNoEvents(paged)) { displayNoEvents(); } else { displayEvents(paged); } } private void displayNoEvents() { pagination.add(new Paragraph(Constants.INSTANCE.NoSocialEvents())); } private boolean thereIsNoEvents(PagedSocialQuery paged) { return paged.socialEvents().isEmpty() && !paged.socialPaged().canIGoBackward(); } private void displayEvents(PagedSocialQuery paged) { model.updateSocialPaged(paged.socialPaged()); for (final SocialActivitiesEvent event : paged.socialEvents()) { if (event.hasLink()) { createSimpleWidgetWithLink(event); } else { createSimpleWidget(event); } } setupPaginationButtonsSocial(); } private void createSimpleWidgetWithLink(final SocialActivitiesEvent event) { final SimpleItemWidgetModel itemModel = new SimpleItemWidgetModel(model, event.getType(), event.getTimestamp(), event.getLinkLabel(), event.getLinkTarget(), event.getLinkType(), SocialBundleHelper.getItemDescription(event.getAdicionalInfos()), event.getSocialUser()) .withLinkCommand(model.getLinkCommand()) .withLinkParams(event.getLinkParams()); if (event.isVFSLink()) { MessageBuilder.createCall(new RemoteCallback<Path>() { public void callback(Path path) { itemModel.withLinkPath(path); addItemWidget(itemModel); } }, VFSService.class).get(event.getLinkTarget()); } else { addItemWidget(itemModel); } } private void addItemWidget(SimpleItemWidgetModel model) { final SimpleItemWidget item = GWT.create(SimpleItemWidget.class); item.init(model); itemsPanel.add(item); } private void createSimpleWidget(SocialActivitiesEvent event) { final SimpleItemWidgetModel rowModel = new SimpleItemWidgetModel(event.getType(), event.getTimestamp(), event.getDescription(), SocialBundleHelper.getItemDescription(event.getAdicionalInfos()), event.getSocialUser()) .withLinkParams(event.getLinkParams()); addItemWidget(rowModel); } private void setupPaginationButtonsSocial() { final Pager pager = new Pager(); if (canICreateLessLink()) { pager.add(model.getLess()); } if (canICreateMoreLink()) { pager.add(model.getMore()); } if (canICreateLessLink() || canICreateMoreLink()) { pagination.add(pager); } } private boolean canICreateMoreLink() { return model.getSocialPaged().canIGoForward() && model.getMore() != null; } private boolean canICreateLessLink() { return model.getSocialPaged().canIGoBackward() && model.getLess() != null; } private void setupPaginationLinks() { if (model.getLess() != null) { createLessLink(); } if (model.getMore() != null) { createMoreLink(); } } private void createMoreLink() { model.getMore().addDomHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { model.getSocialPaged().forward(); refreshTimelineWidget(); } }, ClickEvent.getType()); } private void createLessLink() { model.getLess().addDomHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { model.getSocialPaged().backward(); refreshTimelineWidget(); } }, ClickEvent.getType()); } interface MyUiBinder extends UiBinder<Widget, SimpleSocialTimelineWidget> { } }