org.eclipse.mylyn.reviews.ui.spi.editor.ReviewDetailSection.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.mylyn.reviews.ui.spi.editor.ReviewDetailSection.java

Source

/*******************************************************************************
 * Copyright (c) 2010, 2013 Tasktop Technologies and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Tasktop Technologies - initial API and implementation
 *     Jan Lohre (SAP) - improvements
 *     Sascha Scholz (SAP) - improvements
 *******************************************************************************/

package org.eclipse.mylyn.reviews.ui.spi.editor;

import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;

import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.mylyn.commons.ui.CommonImages;
import org.eclipse.mylyn.internal.reviews.ui.ReviewsImages;
import org.eclipse.mylyn.reviews.core.model.IApprovalType;
import org.eclipse.mylyn.reviews.core.model.IChange;
import org.eclipse.mylyn.reviews.core.model.IRequirementEntry;
import org.eclipse.mylyn.reviews.core.model.IReview;
import org.eclipse.mylyn.reviews.core.model.IReviewerEntry;
import org.eclipse.mylyn.reviews.core.model.IUser;
import org.eclipse.mylyn.reviews.core.model.RequirementStatus;
import org.eclipse.mylyn.reviews.ui.spi.factories.AbstractUiFactoryProvider;
import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;

/**
 * Displays basic information about a given review corresponding to top sections of Gerrit web interface.
 * 
 * @author Steffen Pingel
 * @author Miles Parker
 */
public abstract class ReviewDetailSection extends AbstractReviewSection {

    public ReviewDetailSection() {
        setPartName(Messages.ReviewDetailSection_Review);
    }

    @Override
    protected Control createContent(FormToolkit toolkit, Composite parent) {
        Control content = super.createContent(toolkit, parent);
        createReviewersSubSection(composite);
        createDependenciesSubSection(toolkit, composite, Messages.ReviewDetailSection_Depends_On,
                getReview().getParents());
        createDependenciesSubSection(toolkit, composite, Messages.ReviewDetailSection_Needed_By,
                getReview().getChildren());
        return content;
    }

    protected void createReviewersSubSection(Composite parent) {
        if (getReview().getReviewerApprovals().isEmpty() && !canAddReviewers()) {
            return;
        }

        int style = ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT
                | ExpandableComposite.LEFT_TEXT_CLIENT_ALIGNMENT | ExpandableComposite.EXPANDED;

        final Section subSection = toolkit.createSection(parent, style);
        GridDataFactory.fillDefaults().grab(true, false).applyTo(subSection);
        subSection.setTitleBarForeground(toolkit.getColors().getColor(IFormColors.TITLE));
        subSection.setText(Messages.ReviewDetailSection_Reviewers);

        Composite composite = toolkit.createComposite(subSection);
        List<IApprovalType> approvalTypes = getModelRepository().getApprovalTypes();
        List<IApprovalType> approvalTypesWithLabel = new ArrayList<IApprovalType>(approvalTypes.size());
        for (IApprovalType approvalType : approvalTypes) {
            if (!approvalType.getName().equals(approvalType.getKey())) {
                approvalTypesWithLabel.add(approvalType);
            }
        }

        int numColumns = approvalTypesWithLabel.size() + 1;
        GridLayoutFactory.fillDefaults().numColumns(numColumns).extendedMargins(0, 0, 0, 5).equalWidth(true)
                .spacing(4, 5).applyTo(composite);
        subSection.setClient(composite);

        if (!approvalTypesWithLabel.isEmpty()) {
            StringBuilder names = new StringBuilder();

            Label headerLabel = new Label(composite, SWT.NONE);
            headerLabel.setText(" "); //$NON-NLS-1$
            StringBuilder needs = new StringBuilder();

            for (IApprovalType approvalType : approvalTypesWithLabel) {
                IRequirementEntry requirementEntry = getReview().getRequirements().get(approvalType);
                Composite headerContainer = new Composite(composite, SWT.NONE);
                headerContainer.setForeground(toolkit.getColors().getColor(IFormColors.TB_BG));
                GridLayoutFactory.fillDefaults().numColumns(2).applyTo(headerContainer);
                GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.FILL).applyTo(headerContainer);
                CLabel approvalHeaderLabel = new CLabel(headerContainer, SWT.NONE);
                approvalHeaderLabel.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
                approvalHeaderLabel.setText(approvalType.getName());
                GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(approvalHeaderLabel);
                RequirementStatus status = null;
                if (requirementEntry != null) {
                    status = requirementEntry.getStatus();
                    switch (status) {
                    case SATISFIED:
                        approvalHeaderLabel.setImage(CommonImages.getImage(ReviewsImages.APPROVED));
                        break;
                    case NOT_SATISFIED:
                        approvalHeaderLabel.setImage(CommonImages.getImage(ReviewsImages.UNKNOWN));
                        break;
                    case REJECTED:
                        approvalHeaderLabel.setImage(CommonImages.getImage(ReviewsImages.REJECTED));
                        break;
                    default:
                        //To ensure that label is aligned properly
                        approvalHeaderLabel.setImage(CommonImages.getImage(ReviewsImages.BLANK));
                        break;
                    }
                }
                if (status != null
                        && (status == RequirementStatus.UNKNOWN || status == RequirementStatus.REJECTED)) {
                    if (needs.length() > 0) {
                        needs.append(", "); //$NON-NLS-1$
                    }
                    needs.append(approvalType.getName());
                }
            }

            for (Entry<IUser, IReviewerEntry> entry : getReview().getReviewerApprovals().entrySet()) {

                Label reviewerRowLabel = new Label(composite, SWT.NONE);
                reviewerRowLabel.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
                reviewerRowLabel.setText(entry.getKey().getDisplayName());

                for (IApprovalType approvalType : approvalTypesWithLabel) {
                    Integer value = entry.getValue().getApprovals().get(approvalType);
                    Label approvalValueLabel = new Label(composite, SWT.NONE);
                    GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.FILL).applyTo(approvalValueLabel);
                    String rankingText = " "; //$NON-NLS-1$
                    if (value != null && value != 0) {
                        if (value > 0) {
                            rankingText += "+"; //$NON-NLS-1$
                            approvalValueLabel
                                    .setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN));
                        } else if (value < 0) {
                            approvalValueLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
                        }
                        rankingText += value;
                        approvalValueLabel.setToolTipText(value + "  " + approvalType.getName()); //$NON-NLS-1$
                    }
                    approvalValueLabel.setText(rankingText);
                }
                if (names.length() > 0) {
                    names.append(", "); //$NON-NLS-1$
                }
                names.append(entry.getKey().getDisplayName());
            }

            String headerText = names.toString();
            if (needs.length() > 0) {
                headerText += NLS.bind(Messages.ReviewDetailSection_Needs_X, needs);
            }
            if (headerText.length() > 0) {
                addTextClient(toolkit, subSection, headerText);
            }
        }
        if (getUiFactoryProvider() != null) {
            Composite actionComposite = getUiFactoryProvider().createControls(this, composite, getToolkit(),
                    getReview());
            GridDataFactory.fillDefaults().span(2, 1).applyTo(actionComposite);
        }
    }

    protected boolean canAddReviewers() {
        return true;
    }

    protected void createDependenciesSubSection(final FormToolkit toolkit, final Composite parent, String title,
            List<IChange> changes) {
        if (changes.isEmpty()) {
            return;
        }

        int style = ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT;

        final Section subSection = toolkit.createSection(parent, style);
        GridDataFactory.fillDefaults().grab(true, false).applyTo(subSection);
        subSection.setTitleBarForeground(toolkit.getColors().getColor(IFormColors.TITLE));
        subSection.setText(title);

        Composite composite = toolkit.createComposite(subSection);
        GridLayoutFactory.fillDefaults().extendedMargins(0, 0, 0, 5).applyTo(composite);
        subSection.setClient(composite);

        for (final IChange change : changes) {
            Link link = new Link(composite, SWT.NONE);
            String changeStatus = change.getState() != null
                    ? NLS.bind(Messages.ReviewDetailSection_Bracket_X_bracket,
                            String.valueOf(change.getState().getName()))
                    : " "; //$NON-NLS-1$
            String ownerName = change.getOwner().getDisplayName();
            link.setText(NLS.bind(Messages.ReviewDetailSection_Link_W_X_Y_by_Z, new String[] {
                    StringUtils.left(change.getKey(), 9), change.getSubject(), ownerName, changeStatus }));
            link.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    TasksUiUtil.openTask(getTaskEditorPage().getTaskRepository(), change.getId());
                }
            });
        }
    }

    protected abstract AbstractUiFactoryProvider<IReview> getUiFactoryProvider();

    @Override
    protected boolean shouldExpandOnCreate() {
        return true;
    }
}