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

Java tutorial

Introduction

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

Source

/*******************************************************************************
 * Copyright (c) 2013 Tasktop Technologies, Ericsson 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
 *     Sam Davis - improvements for bug 383592
 *******************************************************************************/

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

import java.text.DateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.internal.reviews.ui.providers.ReviewsLabelProvider;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil;
import org.eclipse.mylyn.reviews.core.model.IFileItem;
import org.eclipse.mylyn.reviews.core.model.IRepository;
import org.eclipse.mylyn.reviews.core.model.IReview;
import org.eclipse.mylyn.reviews.core.model.IReviewItemSet;
import org.eclipse.mylyn.reviews.core.spi.remote.emf.RemoteEmfConsumer;
import org.eclipse.mylyn.reviews.core.spi.remote.emf.RemoteEmfObserver;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
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.Text;
import org.eclipse.ui.forms.FormColors;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.eclipse.ui.forms.widgets.Section;

/**
 * @author Steffen Pingel
 * @author Miles Parker
 * @author Sam Davis
 */
public class ReviewSetContentSection {

    private static final int MAXIMUM_ITEMS_SHOWN = 30;

    private final ReviewSetSection parentSection;

    private final IReviewItemSet set;

    private final Section section;

    private TableViewer viewer;

    private final RemoteEmfObserver<IReviewItemSet, List<IFileItem>, String, Long> itemListClient = new RemoteEmfObserver<IReviewItemSet, List<IFileItem>, String, Long>() {

        @Override
        public void created(IReviewItemSet parentObject, java.util.List<IFileItem> modelObject) {
            createItemSetTable();
            updateMessage();
        }

        @Override
        public void updated(IReviewItemSet parentObject, java.util.List<IFileItem> modelObject, boolean modified) {
            if (modified) {
                updateItemSetTable();
            }
            updateMessage();
        }

        @Override
        public void updating(IReviewItemSet parent, java.util.List<IFileItem> object) {
            updateMessage();
        }

        @Override
        public void failed(IReviewItemSet parent, List<IFileItem> object, IStatus status) {
            Status errorStatus = new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Error loading patch set",
                    status.getException());
            StatusHandler.log(errorStatus);
            if (getParentSection().getSection().getTextClient() != null) {
                AbstractReviewSection.appendMessage(getParentSection().getSection(), "Couldn't load patch set.");
            }
        }
    };

    private Composite tableContainer;

    private Composite actionContainer;

    public ReviewSetContentSection(ReviewSetSection parentSection, final IReviewItemSet set) {
        this.parentSection = parentSection;
        this.set = set;
        int style = ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT
                | ExpandableComposite.LEFT_TEXT_CLIENT_ALIGNMENT;
        section = parentSection.getToolkit().createSection(parentSection.getComposite(), style);
        GridDataFactory.fillDefaults().grab(true, false).applyTo(section);
        section.setText(set.getName());
        section.setTitleBarForeground(parentSection.getToolkit().getColors().getColor(IFormColors.TITLE));

        parentSection.addTextClient(parentSection.getToolkit(), section, "", false); //$NON-NLS-1$
        final RemoteEmfConsumer<IReviewItemSet, List<IFileItem>, String, ?, ?, Long> itemSetConsumer = getParentSection()
                .getReviewEditorPage().getFactoryProvider().getReviewItemSetContentFactory()
                .getConsumerForLocalKey(set, set.getId());
        itemListClient.setConsumer(itemSetConsumer);
        final RemoteEmfConsumer<IRepository, IReview, String, ?, ?, Date> reviewConsumer = getParentSection()
                .getReviewEditorPage().getFactoryProvider().getReviewFactory()
                .getConsumerForModel(set.getReview().getRepository(), set.getReview());
        reviewConsumer.addObserver(new RemoteEmfObserver<IRepository, IReview, String, Date>() {
            @Override
            public void updated(IRepository parentObject, IReview modelObject, boolean modified) {
                if (reviewConsumer.getRemoteObject() != null && section.isExpanded() && modified) {
                    itemSetConsumer.retrieve(false);
                    updateMessage();
                    craeteButtons();
                }
            }

            @Override
            public void failed(IRepository parentObject, IReview modelObject, IStatus status) {
                AbstractReviewSection.appendMessage(getSection(),
                        "Couldn't load patch set: " + status.getMessage());
            }
        });

        section.addExpansionListener(new ExpansionAdapter() {
            @Override
            public void expansionStateChanged(ExpansionEvent e) {
                if (e.getState()) {
                    if (set.getItems().isEmpty()) {
                        itemSetConsumer.retrieve(false);
                    }
                    updateMessage();
                    craeteButtons();
                }
            }
        });
        createMainSection();
        createItemSetTable();
        updateMessage();
    }

    public void updateMessage() {
        if (section.isDisposed()) {
            return;
        }
        String message;

        String time = DateFormat.getDateTimeInstance().format(set.getCreationDate());
        int numComments = set.getAllComments().size();
        if (numComments > 0) {
            message = NLS.bind("{0}, {1} Comments", time, numComments);
        } else {
            message = NLS.bind("{0}", time);
        }

        if (itemListClient != null && itemListClient.getConsumer().isRetrieving()) {
            message += " " + org.eclipse.mylyn.internal.reviews.ui.Messages.Reviews_RetrievingContents;
        }

        AbstractReviewSection.appendMessage(getSection(), message);
    }

    void createMainSection() {
        Composite composite = parentSection.getToolkit().createComposite(section);
        GridLayoutFactory.fillDefaults().numColumns(2).applyTo(composite);
        section.setClient(composite);

        Label authorLabel = new Label(composite, SWT.NONE);
        FormColors colors = parentSection.getToolkit().getColors();
        authorLabel.setForeground(colors.getColor(IFormColors.TITLE));
        authorLabel.setText("Author");

        Text authorText = new Text(composite, SWT.READ_ONLY);
        if (set.getAddedBy() != null) {
            authorText.setText(set.getAddedBy().getDisplayName());
        } else {
            authorText.setText("Unspecified");
        }

        Label committerLabel = new Label(composite, SWT.NONE);
        committerLabel.setForeground(colors.getColor(IFormColors.TITLE));
        committerLabel.setText("Committer");

        Text committerText = new Text(composite, SWT.READ_ONLY);
        if (set.getCommittedBy() != null) {
            committerText.setText(set.getCommittedBy().getDisplayName());
        } else {
            committerText.setText("Unspecified");
        }

        Label commitLabel = new Label(composite, SWT.NONE);
        commitLabel.setForeground(colors.getColor(IFormColors.TITLE));
        commitLabel.setText("Commit");

        Hyperlink commitLink = new Hyperlink(composite, SWT.READ_ONLY);
        commitLink.setText(set.getRevision());
        commitLink.addHyperlinkListener(new HyperlinkAdapter() {
            @Override
            public void linkActivated(HyperlinkEvent event) {
                getParentSection().getUiFactoryProvider()
                        .getOpenCommitFactory(ReviewSetContentSection.this.getParentSection(), set).execute();
            }
        });

        Label refLabel = new Label(composite, SWT.NONE);
        refLabel.setForeground(colors.getColor(IFormColors.TITLE));
        refLabel.setText("Ref");

        Text refText = new Text(composite, SWT.READ_ONLY);
        refText.setText(set.getReference());

        tableContainer = new Composite(composite, SWT.NONE);
        tableContainer.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GRAY));
        GridDataFactory.fillDefaults().span(2, 1).grab(true, true).applyTo(tableContainer);
        GridLayoutFactory.fillDefaults().numColumns(2).applyTo(tableContainer);

        actionContainer = new Composite(composite, SWT.NONE);
        GridDataFactory.fillDefaults().span(2, 1).grab(true, true).applyTo(actionContainer);
        GridLayoutFactory.fillDefaults().numColumns(1).applyTo(actionContainer);
        craeteButtons();

        parentSection.getTaskEditorPage().reflow();
    }

    public void createItemSetTable() {
        if (viewer == null && !set.getItems().isEmpty()) {

            boolean fixedViewerSize = set.getItems().size() > MAXIMUM_ITEMS_SHOWN;
            int heightHint = fixedViewerSize ? 300 : SWT.DEFAULT;
            int style = SWT.SINGLE | SWT.BORDER | SWT.VIRTUAL;
            if (fixedViewerSize) {
                style |= SWT.V_SCROLL;
            } else {
                style |= SWT.NO_SCROLL;
            }
            viewer = new TableViewer(tableContainer, style);
            GridDataFactory.fillDefaults().span(2, 1).grab(true, true).hint(500, heightHint)
                    .applyTo(viewer.getControl());
            viewer.setContentProvider(new IStructuredContentProvider() {

                public void dispose() {
                    // ignore
                }

                public Object[] getElements(Object inputElement) {
                    return getReviewItems(inputElement).toArray();
                }

                private List<IFileItem> getReviewItems(Object inputElement) {
                    if (inputElement instanceof IReviewItemSet) {
                        return ((IReviewItemSet) inputElement).getItems();
                    }
                    return Collections.emptyList();
                }

                public void inputChanged(final Viewer viewer, Object oldInput, Object newInput) {
                }
            });
            ColumnViewerToolTipSupport.enableFor(viewer, ToolTip.NO_RECREATE);

            final DelegatingStyledCellLabelProvider styledLabelProvider = new DelegatingStyledCellLabelProvider(
                    new ReviewsLabelProvider.Simple()) {
                @Override
                public String getToolTipText(Object element) {
                    //For some reason tooltips are not delegated..
                    return ReviewsLabelProvider.ITEMS_COLUMN.getToolTipText(element);
                };
            };
            viewer.setLabelProvider(styledLabelProvider);
            viewer.addOpenListener(new IOpenListener() {
                public void open(OpenEvent event) {
                    IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                    IFileItem item = (IFileItem) selection.getFirstElement();
                    if (item != null) {
                        getParentSection().getUiFactoryProvider()
                                .getOpenFileFactory(ReviewSetContentSection.this.getParentSection(), set, item)
                                .execute();
                    }
                }
            });
            EditorUtil.addScrollListener(viewer.getTable());
            viewer.setInput(set);
            getParentSection().getTaskEditorPage().reflow();
        }
    }

    public void updateItemSetTable() {
        if (set.getItems().size() > 0 && viewer != null) {
            viewer.setInput(set);
        }
    }

    public void craeteButtons() {
        if (!actionContainer.isDisposed()) {
            for (Control oldActionControl : actionContainer.getChildren()) {
                oldActionControl.dispose();
            }
            getParentSection().getUiFactoryProvider().createControls(getParentSection(), actionContainer,
                    getParentSection().getToolkit(), set);
            actionContainer.layout();
            getParentSection().getTaskEditorPage().reflow();
        }
    }

    public Section getSection() {
        return section;
    }

    public ReviewSetSection getParentSection() {
        return parentSection;
    }

    public void dispose() {
        itemListClient.dispose();
        section.dispose();
    }
}