org.headsupdev.agile.web.components.milestones.MilestoneListPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.headsupdev.agile.web.components.milestones.MilestoneListPanel.java

Source

/*
 * HeadsUp Agile
 * Copyright 2009-2014 Heads Up Development Ltd.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.headsupdev.agile.web.components.milestones;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.PageParameters;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.OrderByBorder;
import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
import org.apache.wicket.markup.html.CSSPackageResource;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;
import org.headsupdev.agile.api.Manager;
import org.headsupdev.agile.api.Project;
import org.headsupdev.agile.api.User;
import org.headsupdev.agile.storage.HibernateStorage;
import org.headsupdev.agile.storage.dao.MilestonesDAO;
import org.headsupdev.agile.storage.hibernate.NameProjectId;
import org.headsupdev.agile.storage.issues.Milestone;
import org.headsupdev.agile.storage.issues.MilestoneGroup;
import org.headsupdev.agile.web.HeadsUpPage;
import org.headsupdev.agile.web.HeadsUpSession;
import org.headsupdev.agile.web.components.*;
import org.headsupdev.agile.web.wicket.StyledPagingNavigator;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.wicketstuff.animator.Animator;
import org.wicketstuff.animator.IAnimatorSubject;
import org.wicketstuff.animator.MarkupIdModel;

import java.util.Date;

/**
 * A panel that displays a formatted, coloured list of the milestones passed in
 *
 * @author Andrew Williams
 * @version $Id$
 * @since 2.0
 */
public class MilestoneListPanel extends Panel {
    private static final int ITEMS_PER_PAGE = 25;
    private final WebMarkupContainer rowAdd;
    private boolean hideProject;
    private MilestoneGroup group;
    private String groupReference;
    private StyledPagingNavigator pagingHeader, pagingFooter;
    private Milestone quickMilestone;
    private HeadsUpPage page;
    private WebMarkupContainer quickAdd;
    private WebMarkupContainer icon;
    private static final int UNGROUPED_NUMBER = -1;

    public MilestoneListPanel(String id, final SortableDataProvider<Milestone> provider, final HeadsUpPage page,
            final boolean hideProject, MilestoneGroup group) {
        this(id, provider, page, hideProject, group, UNGROUPED_NUMBER);
    }

    public MilestoneListPanel(String id, final SortableDataProvider<Milestone> provider, final HeadsUpPage page,
            final boolean hideProject, MilestoneGroup group, int groupNumber) {
        super(id);

        add(CSSPackageResource.getHeaderContribution(getClass(), "milestone.css"));
        this.page = page;
        this.group = group;
        this.hideProject = hideProject;

        if (groupNumber == UNGROUPED_NUMBER) {
            this.groupReference = "group";
        } else {
            this.groupReference = "group" + groupNumber;
        }

        rowAdd = new WebMarkupContainer("rowAddMilestone");
        rowAdd.setMarkupId("rowAddMilestone" + groupNumber);

        Form<Milestone> inlineForm = getInlineForm();
        add(inlineForm);

        final DataView dataView;
        inlineForm.add(dataView = new StripedDataView<Milestone>("milestones", provider, ITEMS_PER_PAGE) {
            protected void populateItem(Item<Milestone> listItem) {
                super.populateItem(listItem);

                Milestone milestone = listItem.getModelObject();
                PageParameters params = new PageParameters();
                params.add("project", milestone.getProject().getId());
                params.add("id", milestone.getName());

                WebMarkupContainer cell = new WebMarkupContainer("id-cell");
                Link idLink = new BookmarkablePageLink("id-link", page.getPageClass("milestones/view"), params);
                idLink.add(new Label("id-label", milestone.getName()));
                cell.add(idLink);
                listItem.add(cell);

                double part = milestone.getCompleteness();
                int percent = (int) (part * 100);
                Panel panel = new PercentagePanel("bar", percent);
                listItem.add(panel);

                int total = milestone.getIssues().size();
                int open = milestone.getOpenIssues().size();
                Label label = new Label("issues", String.valueOf(total));
                listItem.add(label);

                label = new Label("open", String.valueOf(open));
                listItem.add(label);

                label = new Label("project", milestone.getProject().toString());
                listItem.add(label.setVisible(!hideProject));
                label = new Label("due", new FormattedDateModel(milestone.getDueDate(),
                        ((HeadsUpSession) getSession()).getTimeZone()));
                label.add(new MilestoneStatusModifier("due", milestone));
                listItem.add(label);
            }
        });

        AttributeModifier colspanModifier = new AttributeModifier("colspan", true, new Model<Integer>() {
            @Override
            public Integer getObject() {
                int cols = 7;
                if (hideProject) {
                    cols--;
                }

                return cols;
            }
        });
        inlineForm.add(quickAdd);
        inlineForm.add(new OrderByBorder("orderByName", "name.name", provider));
        inlineForm.add(new OrderByBorder("orderByDue", "due", provider));
        inlineForm.add(new OrderByBorder("orderByProject", "name.project.id", provider).setVisible(!hideProject));

        pagingFooter = new StyledPagingNavigator("footerPaging", dataView);
        pagingFooter.setOutputMarkupPlaceholderTag(true);
        inlineForm.add(pagingFooter.add(colspanModifier));
        pagingHeader = new StyledPagingNavigator("headerPaging", dataView);
        pagingHeader.setOutputMarkupPlaceholderTag(true);
        inlineForm.add(pagingHeader.add(colspanModifier));

        final WebMarkupContainer allCell = new WebMarkupContainer("allCell");
        inlineForm.add(allCell.add(colspanModifier).setVisible(provider.size() > ITEMS_PER_PAGE));
        allCell.add(new Link("allLink") {
            @Override
            public void onClick() {
                dataView.setItemsPerPage(Integer.MAX_VALUE);

                setVisible(false);
                allCell.setVisible(false);
                pagingFooter.setVisible(false);
                pagingHeader.setVisible(false);
            }
        });
    }

    private Form<Milestone> getInlineForm() {
        quickMilestone = createMilestone();
        CompoundPropertyModel<Milestone> formPropertyModel = new CompoundPropertyModel<Milestone>(quickMilestone);
        Form<Milestone> inlineForm = new Form<Milestone>("milestoneInlineForm", formPropertyModel) {
            @Override
            protected void onSubmit() {
                MilestonesDAO dao = new MilestonesDAO();
                boolean alreadyExists = dao.find(quickMilestone.getName(), quickMilestone.getProject()) != null;
                if (alreadyExists) {
                    warn("Cannot create milestone. A milestone with that name already exists.");
                    return;
                }
                quickMilestone.setUpdated(new Date());
                saveMilestone(quickMilestone);
                //TODO: problem with dependency below
                User currentUser = ((HeadsUpSession) getSession()).getUser();
                //                page.getHeadsUpApplication().addEvent( new CreateMilestoneEvent( quickMilestone, quickMilestone.getProject(), currentUser ) );
                quickMilestone = createMilestone();
            }
        };

        Component[] rowAddComponents = new Component[7];
        rowAddComponents[0] = new WebMarkupContainer("submit");
        rowAddComponents[1] = new TextField<NameProjectId>("name");
        rowAddComponents[2] = new PercentagePanel("completeness", 0);
        rowAddComponents[3] = new Label("issues", "0");
        rowAddComponents[4] = new Label("open", "0");
        rowAddComponents[5] = new Label("project", page.getProject().toString());
        rowAddComponents[5].setVisible(!hideProject);
        DateTimeWithTimeZoneField due = new DateTimeWithTimeZoneField("due", new Model<Date>() {
            @Override
            public void setObject(Date object) {
                quickMilestone.setDueDate(object);
            }

            @Override
            public Date getObject() {
                return quickMilestone.getDueDate();
            }
        });
        rowAddComponents[6] = due;

        addAnimatorToForm(rowAddComponents);
        inlineForm.add(rowAdd);
        return inlineForm;
    }

    private void addAnimatorToForm(Component[] rowAddComponents) {
        User currentUser = ((HeadsUpSession) getSession()).getUser();
        quickAdd = new WebMarkupContainer("quickAdd");
        quickAdd.add(new HeadsUpTooltip("Quick-add a milestone"));
        quickAdd.setVisible(Permissions.canEditDoc(currentUser, page.getProject()));

        icon = new WebMarkupContainer("icon");
        icon.setMarkupId("icon" + groupReference).setOutputMarkupId(true);
        Label iconToggleScript = new Label("iconToggleScript",
                "function moveIconBackground" + groupReference + "( value ) {" + "Wicket.$('icon" + groupReference
                        + "').style.backgroundPosition = '0px ' + ( 0 + ( value * 16 ) ) + 'px';}");

        iconToggleScript.setEscapeModelStrings(false);
        quickAdd.add(iconToggleScript);

        Animator animator = new Animator("" + groupReference + "Animator");

        animator.addCssStyleSubject(new MarkupIdModel(rowAdd.setOutputMarkupId(true)), "rowhidden", "rowshown");

        for (Component rowAddComponent : rowAddComponents) {
            rowAdd.add(rowAddComponent);
            if (rowAddComponent.isVisible()) {
                animator.addCssStyleSubject(new MarkupIdModel(rowAddComponent.setOutputMarkupId(true)), "hidden",
                        "shown");
            }
        }

        animator.addSubject(new IAnimatorSubject() {
            public String getJavaScript() {
                return "moveIconBackground" + groupReference;
            }

        });

        animator.attachTo(quickAdd, "onclick", Animator.Action.toggle());
        quickAdd.add(icon);
    }

    private Milestone createMilestone() {
        Project project = page.getProject();
        Milestone milestone = new Milestone("", project);
        milestone.setGroup(group);
        return milestone;
    }

    private void saveMilestone(Milestone milestone) {
        Session session = ((HibernateStorage) Manager.getStorageInstance()).getHibernateSession();

        Transaction tx = session.beginTransaction();
        session.save(milestone);
        tx.commit();
    }
}