Package org.eurekastreams.web.client.ui.common.widgets.activity

Source Code of org.eurekastreams.web.client.ui.common.widgets.activity.StreamDetailsComposite$LocalUiBinder

/*
* Copyright (c) 2009-2012 Lockheed Martin Corporation
*
* Licensed 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.eurekastreams.web.client.ui.common.widgets.activity;

import java.util.List;

import org.eurekastreams.server.action.request.profile.GetCurrentUserFollowingStatusRequest;
import org.eurekastreams.server.action.request.profile.SetFollowingStatusRequest;
import org.eurekastreams.server.action.request.stream.GetFeaturedStreamsPageRequest;
import org.eurekastreams.server.action.request.stream.StreamPopularHashTagsRequest;
import org.eurekastreams.server.domain.DailyUsageSummary;
import org.eurekastreams.server.domain.EntityType;
import org.eurekastreams.server.domain.Follower;
import org.eurekastreams.server.domain.PagedSet;
import org.eurekastreams.server.domain.dto.FeaturedStreamDTO;
import org.eurekastreams.server.domain.stream.StreamScope.ScopeType;
import org.eurekastreams.server.search.modelview.DomainGroupModelView;
import org.eurekastreams.server.search.modelview.PersonModelView;
import org.eurekastreams.server.search.modelview.PersonModelView.Role;
import org.eurekastreams.server.search.modelview.UsageMetricSummaryDTO;
import org.eurekastreams.server.service.actions.requests.UsageMetricStreamSummaryRequest;
import org.eurekastreams.web.client.events.EventBus;
import org.eurekastreams.web.client.events.GotStreamPopularHashTagsEvent;
import org.eurekastreams.web.client.events.Observer;
import org.eurekastreams.web.client.events.PagerResponseEvent;
import org.eurekastreams.web.client.events.ShowNotificationEvent;
import org.eurekastreams.web.client.events.data.AddedFeaturedStreamResponseEvent;
import org.eurekastreams.web.client.events.data.DeletedFeaturedStreamResponse;
import org.eurekastreams.web.client.events.data.DeletedRequestForGroupMembershipResponseEvent;
import org.eurekastreams.web.client.events.data.GotFeaturedStreamsPageResponseEvent;
import org.eurekastreams.web.client.events.data.GotGroupModelViewInformationResponseEvent;
import org.eurekastreams.web.client.events.data.GotPersonFollowerStatusResponseEvent;
import org.eurekastreams.web.client.events.data.GotPersonalInformationResponseEvent;
import org.eurekastreams.web.client.events.data.GotStreamResponseEvent;
import org.eurekastreams.web.client.events.data.GotUsageMetricSummaryEvent;
import org.eurekastreams.web.client.events.data.InsertedGroupMemberResponseEvent;
import org.eurekastreams.web.client.model.BaseActivitySubscriptionModel;
import org.eurekastreams.web.client.model.BaseModel;
import org.eurekastreams.web.client.model.CurrentUserPersonFollowingStatusModel;
import org.eurekastreams.web.client.model.Deletable;
import org.eurekastreams.web.client.model.FeaturedStreamModel;
import org.eurekastreams.web.client.model.GroupActivitySubscriptionModel;
import org.eurekastreams.web.client.model.GroupMembersModel;
import org.eurekastreams.web.client.model.Insertable;
import org.eurekastreams.web.client.model.PersonActivitySubscriptionModel;
import org.eurekastreams.web.client.model.PersonFollowersModel;
import org.eurekastreams.web.client.model.PopularHashTagsModel;
import org.eurekastreams.web.client.model.UsageMetricModel;
import org.eurekastreams.web.client.ui.Session;
import org.eurekastreams.web.client.ui.common.animation.ExpandCollapseAnimation;
import org.eurekastreams.web.client.ui.common.avatar.AvatarWidget.Size;
import org.eurekastreams.web.client.ui.common.charts.StreamAnalyticsChart;
import org.eurekastreams.web.client.ui.common.dialog.Dialog;
import org.eurekastreams.web.client.ui.common.notifier.Notification;
import org.eurekastreams.web.client.ui.common.pager.CoordinatorsPagerUiStrategy;
import org.eurekastreams.web.client.ui.common.pager.FollowerPagerUiStrategy;
import org.eurekastreams.web.client.ui.common.pager.FollowingPagerUiStrategy;
import org.eurekastreams.web.client.ui.common.pager.GroupMembershipRequestPagerUiStrategy;
import org.eurekastreams.web.client.ui.common.pager.PagerComposite;
import org.eurekastreams.web.client.ui.common.stream.FeatureDialogContent;
import org.eurekastreams.web.client.ui.common.stream.FollowDialogContent;
import org.eurekastreams.web.client.ui.common.stream.renderers.AvatarRenderer;
import org.eurekastreams.web.client.ui.common.stream.transformers.StreamSearchLinkBuilder;
import org.eurekastreams.web.client.ui.pages.master.StaticResourceBundle;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.SpanElement;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.InlineHyperlink;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;

/**
* Post box.
*/
public class StreamDetailsComposite extends Composite
{
    /**
     * Binder for building UI.
     */
    private static LocalUiBinder binder = GWT.create(LocalUiBinder.class);

    /**
     * CSS resource.
     */
    interface StreamDetailsStyle extends CssResource
    {
        /**
         * Condensed Stream view.
         *
         * @return Condensed Stream view.
         */
        String condensedStream();

        /**
         * Active option.
         *
         * @return active option style.
         */
        String activeOption();

        /**
         * Everyone avatar.
         *
         * @return everyone avatar.
         */
        String everyoneAvatar();

        /**
         * Following avatar.
         *
         * @return following avatar.
         */
        String followingAvatar();

        /**
         * Private avatar.
         *
         * @return Private avatar.
         */
        String privateAvatar();

        /**
         * Hide details button.
         *
         * @return hide details button.
         */
        String hideDetails();

        /**
         * Featured item header link style.
         *
         * @return Featured item header link style.
         */
        String headerFeatured();

        /**
         * Empty detail style.
         *
         * @return Empty detail style.
         */
        String emptyDetailStyle();

        /** @return Style for the group contact info link (website URL). */
        @ClassName("group-contact-info")
        String groupContactInfo();
    }

    /**
     * CSS style.
     */
    @UiField
    StreamDetailsStyle style;

    /**
     *
     * Binder for building UI.
     */
    interface LocalUiBinder extends UiBinder<Widget, StreamDetailsComposite>
    {
    }

    /**
     * Default constructor.
     */
    public StreamDetailsComposite()
    {
        initWidget(binder.createAndBindUi(this));
        buildPage();
    }

    /**
     * Empty chart.
     */
    @UiField
    DivElement chartEmpty;

    /**
     * UI element for stream about panel.
     */
    @UiField
    HTMLPanel streamAbout;

    /**
     * UI element for stream details.
     */
    @UiField
    DivElement streamDetailsContainer;

    /**
     * UI element for chart.
     */
    @UiField
    HTMLPanel analyticsChartContainer;

    /**
     * UI element for about link.
     */
    @UiField
    Label aboutLink;

    /**
     * UI element for followers link.
     */
    @UiField
    Label followersLink;

    /**
     * UI element for following link.
     */
    @UiField
    Label followingLink;

    /**
     * UI element for featuring a stream.
     */
    @UiField
    Label featureLink;

    /**
     * UI element for admin link.
     */
    @UiField
    Label adminLink;

    /**
     * UI element for coordinators link.
     */
    @UiField
    Label coordinatorsLink;

    /**
     * Contact info title.
     */
    @UiField
    Element contactInfoTitle;

    /**
     * UI element for toggling details.
     */
    @UiField
    Anchor toggleDetails;

    /**
     * UI element for configure link.
     */
    @UiField
    Anchor configureLink;

    /**
     * UI element for follower count.
     */
    @UiField
    SpanElement followerCount;

    /**
     * UI element for following count.
     */
    @UiField
    SpanElement followingCount;

    /**
     * UI element for stream name.
     */
    @UiField
    DivElement streamName;

    /**
     * UI element for stream meta info.
     */
    @UiField
    DivElement streamMeta;

    /**
     * UI element for stream avatar.
     */
    @UiField
    HTMLPanel streamAvatar;

    /**
     * UI element for condensed stream avatar.
     */
    @UiField
    HTMLPanel condensedAvatar;

    /**
     * UI element for stream description.
     */
    @UiField
    DivElement contactInfo;

    /**
     * UI element for stream description.
     */
    @UiField
    DivElement streamDescription;

    /**
     * UI element for stream interests.
     */
    @UiField
    DivElement streamInterests;

    /**
     * UI element for follow link.
     */
    @UiField
    Label followLink;

    /**
     * UI element for stream hash tags.
     */
    @UiField
    FlowPanel streamHashtags;

    /**
     * UI element for stream followers.
     */
    @UiField
    PagerComposite streamFollowers;

    /**
     * UI element for stream following.
     */
    @UiField
    PagerComposite streamFollowing;

    /**
     * UI element for stream coordinators.
     */
    @UiField
    PagerComposite streamCoordinators;

    /**
     * UI element admin tab content.
     */
    @UiField
    PagerComposite adminContent;

    /**
     * Show following link.
     */
    @UiField
    Label showFollowing;

    /**
     * Show followers link.
     */
    @UiField
    Label showFollowers;

    /**
     * Chart.
     */
    @UiField
    StreamAnalyticsChart chart;

    /**
     * Average viewers.
     */
    @UiField
    SpanElement avgViewers;

    /**
     * Average views.
     */
    @UiField
    SpanElement avgViews;

    /**
     * Average contributors.
     */
    @UiField
    SpanElement avgContributors;

    /**
     * Stream info container.
     */
    @UiField
    DivElement streamInfoContainer;

    /**
     * Average messages.
     */
    @UiField
    SpanElement avgMessages;

    /**
     * Average comments.
     */
    @UiField
    SpanElement avgComments;

    /**
     * Total contributors.
     */
    @UiField
    SpanElement totalContributors;

    /**
     * Total activities.
     */
    @UiField
    SpanElement totalActivities;

    /**
     * Total activities.
     */
    @UiField
    SpanElement totalComments;

    /**
     * Current status.
     */
    private Follower.FollowerStatus status;

    /**
     * Expand animation duration.
     */
    private static final int EXPAND_ANIMATION_DURATION = 500;

    /**
     * Content padding for details.
     */
    private static final int CONTENT_PADDING = 0;

    /**
     * Number of days to gather metrics for.
     */
    private static final Integer NUM_DAYS_FOR_METRICS = 30;

    /**
     * Avatar Renderer.
     */
    private final AvatarRenderer avatarRenderer = new AvatarRenderer();

    /**
     * The helper to build hyperlinks to stream search.
     */
    private final StreamSearchLinkBuilder streamSearchLinkBuilder = new StreamSearchLinkBuilder();

    /**
     * Expand/Collapse animation.
     */
    private ExpandCollapseAnimation detailsContainerAnimation;

    /**
     * Last following handler.
     */
    private HandlerRegistration lastHandler;

    /**
     * Last feature handler.
     */
    private HandlerRegistration lastFeatureHandler;

    /**
     * Model used to set following status.
     */
    private BaseModel followModel;

    /**
     * Stream request.
     */
    private String streamReq;

    /**
     * Stream ID.
     */
    private Long streamId;

    /**
     * Stream is featured.
     */
    private boolean inFeatured;

    /**
     * FeaturedStreamDTO object representing current person/group.
     */
    private FeaturedStreamDTO currentFeaturedStreamDTO;

    /**
     * Featured streams.
     */
    private PagedSet<FeaturedStreamDTO> featuredStreams;

    /**
     * Custom Avatars.
     */
    public enum CustomAvatar
    {
        /**
         * Everyone avatar.
         */
        EVERYONE,
        /**
         * Following avatar.
         */
        FOLLOWING,
        /**
         * Custom stream avatar.
         */
        CUSTOM
    };

    /**
     * Build page.
     */
    private void buildPage()
    {
        // Default style. Prevent flashing.
        streamName.setInnerText("");
        addStyleName(style.condensedStream());
        followLink.setVisible(false);
        featureLink.setVisible(Session.getInstance().getCurrentPersonRoles().contains(Role.SYSTEM_ADMIN));
        detailsContainerAnimation = new ExpandCollapseAnimation(streamDetailsContainer, EXPAND_ANIMATION_DURATION);

        streamAvatar.add(avatarRenderer.render(0L, null, EntityType.PERSON, Size.Normal));

        streamFollowers.init(new FollowerPagerUiStrategy());
        streamFollowing.init(new FollowingPagerUiStrategy());
        adminContent.init(new GroupMembershipRequestPagerUiStrategy());
        streamCoordinators.init(new CoordinatorsPagerUiStrategy());

        streamFollowers.setVisible(false);
        streamFollowing.setVisible(false);
        configureLink.setVisible(false);
        adminLink.setVisible(false);
        coordinatorsLink.setVisible(false);

        showFollowing.setVisible(false);
        followingCount.getStyle().setDisplay(Display.NONE);
        followingLink.setVisible(false);
        adminContent.setVisible(false);

        followersLink.addClickHandler(new ClickHandler()
        {

            public void onClick(final ClickEvent event)
            {
                openFollower();
            }
        });

        followingLink.addClickHandler(new ClickHandler()
        {

            public void onClick(final ClickEvent event)
            {
                openFollowing();
            }
        });

        coordinatorsLink.addClickHandler(new ClickHandler()
        {

            public void onClick(final ClickEvent event)
            {
                openCoordinators();
            }
        });

        adminLink.addClickHandler(new ClickHandler()
        {
            public void onClick(final ClickEvent event)
            {
                openAdmin();
            }
        });

        showFollowers.addClickHandler(new ClickHandler()
        {

            public void onClick(final ClickEvent event)
            {
                openFollower();
            }
        });

        showFollowing.addClickHandler(new ClickHandler()
        {

            public void onClick(final ClickEvent event)
            {
                openFollowing();
            }
        });

        aboutLink.addClickHandler(new ClickHandler()
        {

            public void onClick(final ClickEvent event)
            {
                openAbout();
            }
        });

        toggleDetails.addClickHandler(new ClickHandler()
        {
            public void onClick(final ClickEvent event)
            {
                if (detailsContainerAnimation.isExpanded())
                {
                    toggleDetails.removeStyleName(style.hideDetails());
                    detailsContainerAnimation.collapse();
                }
                else
                {
                    openAbout();
                }
            }
        });

        addEvents();
    }

    /**
     * Add events.
     */
    private void addEvents()
    {
        EventBus.getInstance().addObserver(GotStreamPopularHashTagsEvent.class,
                new Observer<GotStreamPopularHashTagsEvent>()
                {
                    public void update(final GotStreamPopularHashTagsEvent event)
                    {
                        // Note: using widgets since IE will lose all history when navigating using a simple anchor
                        streamHashtags.clear();

                        boolean empty = true;
                        for (String tag : event.getPopularHashTags())
                        {
                            if (empty)
                            {
                                empty = false;
                            }
                            else
                            {
                                streamHashtags.add(new InlineLabel(" "));
                            }
                            streamHashtags.add(new InlineHyperlink(tag, streamSearchLinkBuilder
                                    .buildHashtagSearchLink(tag, null).substring(1)));
                        }

                        if (empty)
                        {
                            streamHashtags.add(new InlineLabel("No popular hashtags."));
                            streamHashtags.addStyleName(style.emptyDetailStyle());
                        }
                        else
                        {
                            streamHashtags.removeStyleName(style.emptyDetailStyle());
                        }
                    }
                });

        EventBus.getInstance().addObserver(PagerResponseEvent.class, new Observer<PagerResponseEvent>()
        {
            public void update(final PagerResponseEvent event)
            {
                detailsContainerAnimation.expandWithPadding(CONTENT_PADDING);
            }
        });

        EventBus.getInstance().addObserver(GotUsageMetricSummaryEvent.class,
                new Observer<GotUsageMetricSummaryEvent>()
                {
                    public void update(final GotUsageMetricSummaryEvent event)
                    {
                        UsageMetricSummaryDTO data = event.getResponse();

                        List<DailyUsageSummary> stats = data.getDailyStatistics();

                        chart.setVisible(stats != null && stats.size() > 0);
                        chartEmpty.getStyle().setDisplay(chart.isVisible() ? Display.NONE : Display.BLOCK);

                        if (stats != null)
                        {
                            for (int i = 0; i < stats.size(); i++)
                            {
                                if (null == stats.get(i))
                                {
                                    chart.addPoint(i, 0.0);
                                }
                                else
                                {
                                    chart.addPoint(i, stats.get(i).getStreamViewCount());
                                }
                            }
                        }

                        avgComments.setInnerText(NumberFormat.getDecimalFormat().format(
                                data.getAverageDailyCommentPerActivityCount()));
                        avgContributors.setInnerText(NumberFormat.getDecimalFormat().format(
                                data.getAverageDailyStreamContributorCount()));
                        avgMessages.setInnerText(NumberFormat.getDecimalFormat().format(
                                data.getAverageDailyMessageCount()));
                        avgViewers.setInnerText(//
                                NumberFormat.getDecimalFormat().format(data.getAverageDailyStreamViewerCount()));
                        avgViews.setInnerText(NumberFormat.getDecimalFormat().format(
                                data.getAverageDailyStreamViewCount()));

                        totalContributors.setInnerText(""
                                + NumberFormat.getDecimalFormat().format(data.getTotalContributorCount()));
                        totalActivities.setInnerText(NumberFormat.getDecimalFormat().format(
                                data.getTotalActivityCount()));
                        totalComments.setInnerText(NumberFormat.getDecimalFormat().format(data.getTotalCommentCount()));
                        chart.update();
                    }
                });

        EventBus.getInstance().addObserver(GotFeaturedStreamsPageResponseEvent.class,
                new Observer<GotFeaturedStreamsPageResponseEvent>()
                {
                    public void update(final GotFeaturedStreamsPageResponseEvent response)
                    {
                        featuredStreams = response.getResponse();
                        updateFeatureLink(currentFeaturedStreamDTO);
                    }
                });

        EventBus.getInstance().addObserver(GotPersonalInformationResponseEvent.class,
                new Observer<GotPersonalInformationResponseEvent>()
                {
                    public void update(final GotPersonalInformationResponseEvent event)
                    {
                        gotPerson(event.getResponse());
                    }

                });

        EventBus.getInstance().addObserver(GotGroupModelViewInformationResponseEvent.class,
                new Observer<GotGroupModelViewInformationResponseEvent>()
                {
                    public void update(final GotGroupModelViewInformationResponseEvent event)
                    {
                        gotGroup(event.getResponse());
                    }
                });

        EventBus.getInstance().addObserver(GotStreamResponseEvent.class, new Observer<GotStreamResponseEvent>()
        {
            public void update(final GotStreamResponseEvent event)
            {
                streamReq = event.getJsonRequest();
            }
        });

        EventBus.getInstance().addObserver(DeletedRequestForGroupMembershipResponseEvent.class,
                new Observer<DeletedRequestForGroupMembershipResponseEvent>()
                {
                    public void update(final DeletedRequestForGroupMembershipResponseEvent event)
                    {
                        openAdmin();
                    }
                }, true);

        EventBus.getInstance().addObserver(InsertedGroupMemberResponseEvent.class,
                new Observer<InsertedGroupMemberResponseEvent>()
                {
                    public void update(final InsertedGroupMemberResponseEvent event)
                    {
                        openAdmin();
                    }
                }, true);

        EventBus.getInstance().addObserver(AddedFeaturedStreamResponseEvent.class,
                new Observer<AddedFeaturedStreamResponseEvent>()
                {
                    public void update(final AddedFeaturedStreamResponseEvent event)
                    {
                        if (Session.getInstance().getCurrentPersonRoles().contains(Role.SYSTEM_ADMIN))
                        {
                            FeaturedStreamModel.getInstance().fetch(
                                    new GetFeaturedStreamsPageRequest(0, Integer.MAX_VALUE), true);
                        }
                    }
                });

        EventBus.getInstance().addObserver(DeletedFeaturedStreamResponse.class,
                new Observer<DeletedFeaturedStreamResponse>()
                {
                    public void update(final DeletedFeaturedStreamResponse event)
                    {
                        if (Session.getInstance().getCurrentPersonRoles().contains(Role.SYSTEM_ADMIN))
                        {
                            FeaturedStreamModel.getInstance().fetch(
                                    new GetFeaturedStreamsPageRequest(0, Integer.MAX_VALUE), true);
                        }
                    }
                });
    }

    /**
     * Set the stream title and avatar.
     *
     * @param inStreamTitle
     *            the title.
     * @param avatar
     *            the avatar.
     */
    public void setStreamTitle(final String inStreamTitle, final CustomAvatar avatar)
    {
        Session.getInstance().setPageTitle(inStreamTitle);
        setStreamName(inStreamTitle);

        switch (avatar)
        {
        case EVERYONE:
            condensedAvatar.addStyleName(style.followingAvatar());
            break;
        case FOLLOWING:
            condensedAvatar.addStyleName(style.everyoneAvatar());
            break;
        case CUSTOM:
            break;
        default:
            break;
        }

    }

    /**
     * Initialize the view.
     */
    public void init()
    {
        chart.clearPoints();
        chart.update();

        // Collapse right away if open.
        streamDetailsContainer.getStyle().setHeight(0.0, Unit.PX);
        toggleDetails.removeStyleName(style.hideDetails());

        condensedAvatar.removeStyleName(style.everyoneAvatar());
        condensedAvatar.removeStyleName(style.followingAvatar());
        condensedAvatar.removeStyleName(style.privateAvatar());
    }

    /**
     * Set Condensed mode.
     *
     * @param isCondensed
     *            condensed mode.
     */
    public void setCondensedMode(final boolean isCondensed)
    {
        if (isCondensed)
        {
            addStyleName(style.condensedStream());

        }
        else
        {
            removeStyleName(style.condensedStream());
        }
    }

    /**
     * Sets the displayed stream name (in a way that the elided style will update properly).
     *
     * @param name
     *            New name.
     */
    private void setStreamName(final String name)
    {
        streamName.removeFromParent();
        streamName.setInnerText(name);
        streamName.setTitle(name);
        streamInfoContainer.insertFirst(streamName);
    }

    /**
     * Go the group.
     *
     * @param group
     *            the group.
     */
    private void gotGroup(final DomainGroupModelView group)
    {
        showFollowing.setVisible(false);
        followingCount.getStyle().setDisplay(Display.NONE);
        followingLink.setVisible(false);
        coordinatorsLink.setVisible(true);

        Session.getInstance().setPageTitle(group.getName());
        setStreamName(group.getName());

        if (group.isRestricted())
        {
            condensedAvatar.addStyleName(style.privateAvatar());
            addStyleName(style.condensedStream());
        }
        else
        {
            streamId = group.getStreamId();

            boolean isCoordinator = false;

            for (PersonModelView coordinator : group.getCoordinators())
            {
                if (coordinator.getAccountId().equals(Session.getInstance().getCurrentPerson().getAccountId()))
                {
                    isCoordinator = true;
                    break;
                }
            }

            if (isCoordinator || Session.getInstance().getCurrentPersonRoles().contains(Role.SYSTEM_ADMIN))
            {
                if (!group.isPublic())
                {
                    adminLink.setVisible(true);
                    String detailTabValue = Session.getInstance().getParameterValue("detailtab");
                    if ((detailTabValue != null) && detailTabValue.compareToIgnoreCase("admin") == 0)
                    {
                        openAdmin();
                    }
                }
                configureLink.setVisible(true);
                configureLink.setHref("#groupsettings/" + group.getShortName());
            }
            else
            {
                configureLink.setVisible(false);
            }

            contactInfoTitle.setInnerText("Website");

            String groupUrl = group.getUrl();
            if (groupUrl == null || groupUrl.isEmpty())
            {
                contactInfo.setInnerHTML("No contact information entered.");
                contactInfo.addClassName(style.emptyDetailStyle());
            }
            else
            {
                // insert wbr tags to help IE break line somewhere nice.
                String displayUrl = groupUrl.replaceAll("([/?&=]+)", "$1<wbr />");
                contactInfo.setInnerHTML("<a href=\"" + groupUrl + "\">" + displayUrl + "</a>");
                contactInfo.removeClassName(style.emptyDetailStyle());
                contactInfo.addClassName(style.groupContactInfo());
            }

            updateFollowLink(group.getShortName(), EntityType.GROUP);
            FeaturedStreamDTO featuredStreamDTO = new FeaturedStreamDTO();
            featuredStreamDTO.setDescription(group.getDescription());
            featuredStreamDTO.setStreamId(group.getStreamId());
            featuredStreamDTO.setStreamType(ScopeType.GROUP);
            featuredStreamDTO.setDisplayName(group.getDisplayName());

            currentFeaturedStreamDTO = featuredStreamDTO;

            if (Session.getInstance().getCurrentPersonRoles().contains(Role.SYSTEM_ADMIN))
            {
                FeaturedStreamModel.getInstance().fetch(new GetFeaturedStreamsPageRequest(0, Integer.MAX_VALUE), true);
            }

            streamMeta.setInnerText("");
            streamAvatar.clear();
            streamAvatar.add(avatarRenderer.render(group.getEntityId(), group.getAvatarId(), EntityType.GROUP,
                    Size.Normal));

            followerCount.setInnerText(Integer.toString(group.getFollowersCount()));
            streamDescription.setInnerText(group.getDescription());

            if (group.getDescription() == null || group.getDescription().length() == 0)
            {
                streamDescription.setInnerHTML("No group description entered.");
                streamDescription.addClassName(style.emptyDetailStyle());
            }
            else
            {
                streamDescription.removeClassName(style.emptyDetailStyle());
            }

            String interestString = "";
            for (String interest : group.getCapabilities())
            {
                interestString += "<a href='#search?query=" + interest + "'>" + interest + "</a> ";
            }
            streamInterests.setInnerHTML(interestString);

            if (interestString.length() == 0)
            {
                streamInterests.setInnerHTML("No interested entered.");
                streamInterests.addClassName(style.emptyDetailStyle());
            }
            else
            {
                streamInterests.removeClassName(style.emptyDetailStyle());
            }

            PopularHashTagsModel.getInstance().fetch(
                    new StreamPopularHashTagsRequest(ScopeType.GROUP, group.getShortName()), true);
            UsageMetricModel.getInstance().fetch(
                    new UsageMetricStreamSummaryRequest(NUM_DAYS_FOR_METRICS, group.getStreamId()), true);
        }

    }

    /**
     * Update the feature link.
     *
     * @param featuredStreamDTO
     *            the stream.
     */
    public void updateFeatureLink(final FeaturedStreamDTO featuredStreamDTO)
    {
        if (Session.getInstance().getCurrentPersonRoles().contains(Role.SYSTEM_ADMIN))
        {
            inFeatured = false;
            featureLink.removeStyleName(style.headerFeatured());

            for (FeaturedStreamDTO featured : featuredStreams.getPagedSet())
            {
                if (featured.getStreamId().longValue() == streamId.longValue())
                {
                    inFeatured = true;
                    featuredStreamDTO.setId(featured.getId());
                    featureLink.addStyleName(style.headerFeatured());
                    break;
                }
            }

            if (lastFeatureHandler != null)
            {
                lastFeatureHandler.removeHandler();
            }

            lastFeatureHandler = featureLink.addClickHandler(new ClickHandler()
            {
                public void onClick(final ClickEvent event)
                {
                    if (inFeatured)
                    {
                        FeaturedStreamModel.getInstance().delete(featuredStreamDTO.getId());
                        EventBus.getInstance().notifyObservers(
                                new ShowNotificationEvent(new Notification(
                                        "Stream has been removed from the featured streams list.")));
                    }
                    else
                    {
                        Dialog.showCentered(new FeatureDialogContent(featuredStreamDTO));
                    }
                }
            });

        }
    }

    /**
     * Update the following element.
     *
     * @param entityId
     *            the id of the entity.
     * @param type
     *            the type.
     */
    public void updateFollowLink(final String entityId, final EntityType type)
    {
        if (!entityId.equals(Session.getInstance().getCurrentPerson().getAccountId()))
        {
            followModel = GroupMembersModel.getInstance();
            final BaseActivitySubscriptionModel subscribeModel = EntityType.PERSON.equals(type) ? // \n
            PersonActivitySubscriptionModel.getInstance()
                    : GroupActivitySubscriptionModel.getInstance();

            if (type.equals(EntityType.PERSON))
            {
                followModel = PersonFollowersModel.getInstance();
            }

            if (lastHandler != null)
            {
                lastHandler.removeHandler();
            }

            lastHandler = followLink.addClickHandler(new ClickHandler()
            {
                public void onClick(final ClickEvent event)
                {
                    SetFollowingStatusRequest request;

                    switch (status)
                    {
                    case FOLLOWING:
                        request = new SetFollowingStatusRequest(Session.getInstance().getCurrentPerson()
                                .getAccountId(), entityId, type, false, Follower.FollowerStatus.NOTFOLLOWING);
                        ((Deletable<SetFollowingStatusRequest>) followModel).delete(request);
                        onFollowerStatusChanged(Follower.FollowerStatus.NOTFOLLOWING);
                        break;
                    case NOTFOLLOWING:
                        request = new SetFollowingStatusRequest(Session.getInstance().getCurrentPerson()
                                .getAccountId(), entityId, type, false, Follower.FollowerStatus.FOLLOWING);
                        ((Insertable<SetFollowingStatusRequest>) followModel).insert(request);
                        Dialog.showCentered(new FollowDialogContent(streamName.getInnerText(), streamReq, streamId,
                                type, subscribeModel, entityId));
                        onFollowerStatusChanged(Follower.FollowerStatus.FOLLOWING);
                        break;
                    default:
                        // do nothing.
                        break;
                    }
                }
            });

            Session.getInstance()
                    .getEventBus()
                    .addObserver(GotPersonFollowerStatusResponseEvent.class,
                            new Observer<GotPersonFollowerStatusResponseEvent>()
                            {
                                public void update(final GotPersonFollowerStatusResponseEvent event)
                                {
                                    onFollowerStatusChanged(event.getResponse());
                                }
                            });

            CurrentUserPersonFollowingStatusModel.getInstance().fetch(
                    new GetCurrentUserFollowingStatusRequest(entityId, type), true);
        }
        else
        {
            followLink.setVisible(false);
        }
    }

    /**
     * Open the about panel.
     */
    private void openAbout()
    {
        toggleDetails.addStyleName(style.hideDetails());
        aboutLink.addStyleName(style.activeOption());
        followingLink.removeStyleName(style.activeOption());
        followersLink.removeStyleName(style.activeOption());
        adminLink.removeStyleName(style.activeOption());

        streamFollowing.setVisible(false);
        streamAbout.setVisible(true);
        streamFollowers.setVisible(false);
        adminContent.setVisible(false);
        streamCoordinators.setVisible(false);
        coordinatorsLink.removeStyleName(style.activeOption());

        detailsContainerAnimation.expandWithPadding(CONTENT_PADDING);
    }

    /**
     * Open the following panel.
     */
    private void openFollowing()
    {
        toggleDetails.addStyleName(style.hideDetails());
        aboutLink.removeStyleName(style.activeOption());
        followingLink.addStyleName(style.activeOption());
        followersLink.removeStyleName(style.activeOption());
        adminLink.removeStyleName(style.activeOption());

        streamFollowers.setVisible(false);
        streamAbout.setVisible(false);
        streamFollowing.setVisible(true);
        adminContent.setVisible(false);
        streamCoordinators.setVisible(false);
        coordinatorsLink.removeStyleName(style.activeOption());

        streamFollowing.load();
    }

    /**
     * Open the followers panel.
     */
    private void openFollower()
    {
        toggleDetails.addStyleName(style.hideDetails());
        aboutLink.removeStyleName(style.activeOption());
        followingLink.removeStyleName(style.activeOption());
        followersLink.addStyleName(style.activeOption());
        adminLink.removeStyleName(style.activeOption());

        streamFollowing.setVisible(false);
        streamAbout.setVisible(false);
        streamFollowers.setVisible(true);
        adminContent.setVisible(false);
        streamCoordinators.setVisible(false);
        coordinatorsLink.removeStyleName(style.activeOption());

        streamFollowers.load();
    }

    /**
     * Open the coordinators panel.
     */
    private void openCoordinators()
    {
        toggleDetails.addStyleName(style.hideDetails());
        aboutLink.removeStyleName(style.activeOption());
        followingLink.removeStyleName(style.activeOption());
        followersLink.removeStyleName(style.activeOption());
        adminLink.removeStyleName(style.activeOption());

        streamFollowing.setVisible(false);
        streamAbout.setVisible(false);
        streamFollowers.setVisible(false);
        adminContent.setVisible(false);
        streamCoordinators.setVisible(true);
        coordinatorsLink.addStyleName(style.activeOption());

        streamCoordinators.load();
    }

    /**
     * Open the Admin panel.
     */
    private void openAdmin()
    {
        toggleDetails.addStyleName(style.hideDetails());
        aboutLink.removeStyleName(style.activeOption());
        followingLink.removeStyleName(style.activeOption());
        followersLink.removeStyleName(style.activeOption());
        coordinatorsLink.removeStyleName(style.activeOption());
        adminLink.addStyleName(style.activeOption());

        streamFollowing.setVisible(false);
        streamAbout.setVisible(false);
        streamFollowers.setVisible(false);
        streamCoordinators.setVisible(false);
        adminContent.setVisible(true);
        adminContent.load();
    }

    /**
     * When the following status changes.
     *
     * @param inStatus
     *            status.
     */
    private void onFollowerStatusChanged(final Follower.FollowerStatus inStatus)
    {
        followLink.setVisible(true);
        status = inStatus;

        switch (inStatus)
        {
        case FOLLOWING:
            followLink.addStyleName(StaticResourceBundle.INSTANCE.coreCss().unFollowLink());
            break;
        case NOTFOLLOWING:
            followLink.removeStyleName(StaticResourceBundle.INSTANCE.coreCss().unFollowLink());
            break;
        default:
            break;
        }
    }

    /**
     * Got the person.
     *
     * @param person
     *            the person.
     */
    private void gotPerson(final PersonModelView person)
    {
        showFollowing.setVisible(true);
        followingCount.getStyle().setDisplay(Display.INLINE);
        followingLink.setVisible(true);
        adminLink.setVisible(false);
        coordinatorsLink.setVisible(false);

        streamId = person.getStreamId();
        Session.getInstance().setPageTitle(person.getDisplayName());

        if (person.getAccountId().equals(Session.getInstance().getCurrentPerson().getAccountId()))
        {
            configureLink.setVisible(true);
            configureLink.setHref("#personalsettings/" + person.getAccountId());
        }
        else
        {
            configureLink.setVisible(false);
        }

        updateFollowLink(person.getAccountId(), EntityType.PERSON);
        FeaturedStreamDTO featuredStreamDTO = new FeaturedStreamDTO();
        featuredStreamDTO.setDescription(person.getDescription());
        featuredStreamDTO.setStreamId(person.getStreamId());
        featuredStreamDTO.setStreamType(ScopeType.PERSON);
        featuredStreamDTO.setDisplayName(person.getDisplayName());

        currentFeaturedStreamDTO = featuredStreamDTO;

        if (Session.getInstance().getCurrentPersonRoles().contains(Role.SYSTEM_ADMIN))
        {
            FeaturedStreamModel.getInstance().fetch(new GetFeaturedStreamsPageRequest(0, Integer.MAX_VALUE), true);
        }

        setStreamName(person.getDisplayName());

        streamMeta.setInnerText(person.getTitle());
        streamAvatar.clear();
        streamAvatar.add(avatarRenderer.render(person.getEntityId(), person.getAvatarId(), EntityType.PERSON,
                Size.Normal));

        followerCount.setInnerText(Integer.toString(person.getFollowersCount()));
        followingCount.setInnerText(Integer.toString(person.getFollowingCount() + person.getGroupsCount()));
        streamDescription.setInnerText(person.getJobDescription());

        if (person.getJobDescription() == null || person.getJobDescription().length() == 0)
        {
            streamDescription.setInnerText("No job description entered.");
            streamDescription.addClassName(style.emptyDetailStyle());
        }
        else
        {
            streamDescription.removeClassName(style.emptyDetailStyle());
        }

        String interestString = "";
        for (String interest : person.getInterests())
        {
            interestString += "<a href='#search?query=" + interest + "'>" + interest + "</a> ";
        }
        streamInterests.setInnerHTML(interestString);

        if (interestString.length() == 0)
        {
            streamInterests.setInnerHTML("No interests entered.");
            streamInterests.addClassName(style.emptyDetailStyle());
        }
        else
        {
            streamInterests.removeClassName(style.emptyDetailStyle());
        }

        contactInfoTitle.setInnerText("Contact Information");
        String contact = "";
        String email = person.getEmail();
        if (email != null)
        {
            contact = "<a href=\"mailto:" + email + "\">" + email + "</a>";
        }
        if (person.getWorkPhone() != null)
        {
            if (email != null)
            {
                contact += "<br />";
            }
            contact += person.getWorkPhone();
        }
        contactInfo.setInnerHTML(contact);

        if (contact.length() == 0)
        {
            contactInfo.setInnerHTML("No contact information entered.");
            contactInfo.addClassName(style.emptyDetailStyle());
        }
        else
        {
            contactInfo.removeClassName(style.emptyDetailStyle());
        }

        PopularHashTagsModel.getInstance().fetch(
                new StreamPopularHashTagsRequest(ScopeType.PERSON, person.getAccountId()), true);

        UsageMetricModel.getInstance().fetch(
                new UsageMetricStreamSummaryRequest(NUM_DAYS_FOR_METRICS, person.getStreamId()), true);

    }

}
TOP

Related Classes of org.eurekastreams.web.client.ui.common.widgets.activity.StreamDetailsComposite$LocalUiBinder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.