hudson.gwtmarketplace.client.pages.product.ProductDetailsPanel.java Source code

Java tutorial

Introduction

Here is the source code for hudson.gwtmarketplace.client.pages.product.ProductDetailsPanel.java

Source

/*
 * GNU GENERAL PUBLIC LICENSE, Version 3, 29 June 2007
 */
package hudson.gwtmarketplace.client.pages.product;

import hudson.gwtmarketplace.client.PageLoader;
import hudson.gwtmarketplace.client.Session;
import hudson.gwtmarketplace.client.ajaxfeeds.EntryDiv;
import hudson.gwtmarketplace.client.ajaxfeeds.Feed;
import hudson.gwtmarketplace.client.ajaxfeeds.FeedListener;
import hudson.gwtmarketplace.client.event.ProductUpdatedEvent;
import hudson.gwtmarketplace.client.event.ProductUpdatedEvent.ProductUpdateHandler;
import hudson.gwtmarketplace.client.model.License;
import hudson.gwtmarketplace.client.model.Product;
import hudson.gwtmarketplace.client.model.Status;
import hudson.gwtmarketplace.client.model.UserInfo;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.dom.client.ImageElement;
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.dom.client.TableRowElement;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.gwtpages.client.Pages;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Window;
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.HTML;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.VerticalPanel;

public class ProductDetailsPanel extends Composite implements FeedListener, ClickHandler, ProductUpdateHandler {

    interface MyUiBinder extends UiBinder<HorizontalPanel, ProductDetailsPanel> {
    }

    private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);

    private static DateTimeFormat dateFormat = DateTimeFormat.getMediumDateFormat();
    private static NumberFormat ratingFormat = NumberFormat.getFormat("0.00");

    private Product product;

    @UiField
    DivElement description;
    @UiField
    DivElement tags;
    @UiField
    VerticalPanel links;
    @UiField
    SpanElement versionNumber;
    @UiField
    SpanElement category;
    @UiField
    SpanElement organization;
    @UiField
    SpanElement createdDate;
    @UiField
    SpanElement lastUpdatedDate;
    @UiField
    SpanElement developmentStatus;
    @UiField
    SpanElement license;
    @UiField
    SpanElement views;
    @UiField
    ImageElement icon;
    @UiField
    FlowPanel newsfeedContainer;
    @UiField
    FlowPanel newsfeed;
    @UiField
    TableRowElement categoryRow;
    @UiField
    TableRowElement versionNumberRow;
    @UiField
    TableRowElement organizationRow;
    @UiField
    TableRowElement createdDateRow;
    @UiField
    TableRowElement lastUpdatedDateRow;
    @UiField
    TableRowElement developmentStatusRow;
    @UiField
    TableRowElement licenseRow;
    @UiField
    HTMLPanel additionalDetailsContainer;
    @UiField
    HTMLPanel ratingContainer;
    @UiField
    Anchor rateIt;

    public ProductDetailsPanel() {
        HorizontalPanel container = uiBinder.createAndBindUi(this);
        initWidget(container);
        container.setCellWidth(container.getWidget(0), "132px");
        container.getWidget(0).getElement().getStyle().setPaddingRight(12, Unit.PX);
        rateIt.addClickHandler(this);
        Pages.get().getEventBus().addHandler(ProductUpdatedEvent.TYPE, this);
    }

    @Override
    public void onProductUpdated(Product product) {
        if (null != this.product && product.equals(this.product)) {
            show(product);
        }
    }

    public void show(Product product) {
        Product _previous = this.product;
        this.product = product;
        links.clear();
        if (null == product) {
            newsfeedContainer.setVisible(false);
            newsfeed.clear();
            description.setInnerText("");
            tags.setInnerHTML("");
            category.setInnerText("");
            versionNumber.setInnerText("");
            views.setInnerText("");
            organization.setInnerText("");
            createdDate.setInnerText("");
            lastUpdatedDate.setInnerText("");
            icon.getStyle().setDisplay(Display.NONE);
            ratingContainer.getElement().setInnerText("");
        } else {
            if (!isNull(product.getWebsiteUrl())) {
                links.add(new Anchor("Website", product.getWebsiteUrl(), "_blank"));
            }
            if (!isNull(product.getDemoUrl())) {
                links.add(new Anchor("Showcase", product.getDemoUrl(), "_blank"));
            }
            if (!isNull(product.getDownloadUrl())) {
                links.add(new Anchor("Download", product.getDownloadUrl(), "_blank"));
            }
            if (!isNull(product.getWikiUrl())) {
                links.add(new Anchor("Wiki", product.getWikiUrl(), "_blank"));
            }
            if (!isNull(product.getForumUrl())) {
                links.add(new Anchor("Forum", product.getForumUrl(), "_blank"));
            }
            if (!isNull(product.getIssueTrackerUrl())) {
                links.add(new Anchor("Issue Tracker", product.getIssueTrackerUrl(), "_blank"));
            }
            UserInfo userInfo = Session.get().getLoggedInUser();
            if (null != userInfo && userInfo.getId().equals(product.getUserId())) {
                links.add(new HTML("<br/>"));
                links.add(new Hyperlink("Edit settings",
                        Pages.get().createHistoryToken(PageLoader.PAGE_EDIT_PRODUCT, product.getAlias())));
            }
            description.setInnerHTML(product.getDescription());
            tags.setInnerHTML(createTagHtml(product.getTags()));
            category.setInnerText(product.getCategoryName());
            versionNumber.setInnerText(product.getVersionNumber());
            organization.setInnerText(product.getOrganizationName());
            createdDate.setInnerText(dateFormat.format(product.getCreatedDate()));
            lastUpdatedDate.setInnerText(dateFormat.format(product.getUpdatedDate()));
            if (null == product.getIconKey()) {
                icon.setSrc("images/noicon.gif");
                icon.getStyle().setDisplay(Display.NONE);
            } else {
                icon.setSrc("gwt_marketplace/productImage?key=" + product.getId() + "&ik=" + product.getIconKey());
                icon.getStyle().setDisplay(Display.BLOCK);
            }
            if (null != product.getRating()) {
                ratingContainer.getElement().setInnerText(ratingFormat.format(product.getRating()) + " of 5");
            } else {
                ratingContainer.getElement().setInnerText("");
            }
            developmentStatus.setInnerText(Status.getDisplayValue(product.getStatus()));
            license.setInnerHTML(License.getDisplayValue(product.getLicense()));
            views.setInnerText(product.getNumDailyViews() + " / " + product.getNumMonthlyViews());

            if (null == _previous || !_previous.equals(product)) {
                newsfeed.clear();
                if (null != product.getNewsUrl() && product.getNewsUrl().length() > 0) {
                    newsfeedContainer.setVisible(true);
                    Feed f = new Feed();
                    f.getFeed(product.getNewsUrl(), this);
                } else {
                    newsfeedContainer.setVisible(false);
                }
            }
        }
    }

    private boolean isNull(String s) {
        return (null == s || s.length() == 0);
    }

    @Override
    public void onClick(ClickEvent event) {
        if (event.getSource().equals(rateIt)) {
            onRateIt();
        }
    }

    protected void onRateIt() {
        // FIXME add rate it code
    }

    public String createTagHtml(String[] tags) {
        if (null == tags || tags.length == 0)
            return "(none)";
        else {
            StringBuilder sb = new StringBuilder();
            for (String s : tags) {
                if (sb.length() > 0)
                    sb.append(", ");
                sb.append("<a class=\"tag\" href=\"#").append(PageLoader.PAGE_SEARCH).append("/tag:").append(s)
                        .append("\">").append(s).append("</a>");
            }
            return sb.toString();
        }
    }

    @Override
    public void onSuccess(Feed feed) {
        for (int i = 0; i < feed.getEntries().size(); i++) {
            newsfeed.add(new EntryDiv(feed.getEntries().get(i), i));
        }
    }

    @Override
    public void onFailure() {
        Window.alert("Unable to load news feed");
    }
}