org.eclipse.egit.ui.internal.merge.MergeResultDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.egit.ui.internal.merge.MergeResultDialog.java

Source

/*******************************************************************************
 * Copyright (C) 2010, Jens Baumgart <jens.baumgart@sap.com>
 *
 * 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
 *******************************************************************************/
package org.eclipse.egit.ui.internal.merge;

import java.io.IOException;

import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.UIText;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jgit.api.MergeResult;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectReader;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;

/**
 * Dialog for displaying a MergeResult
 *
 */
public class MergeResultDialog extends Dialog {

    private static final String SPACE = " "; //$NON-NLS-1$

    private static final String EMPTY = ""; //$NON-NLS-1$

    private final MergeResult mergeResult;

    private final Repository repository;

    private ObjectReader objectReader;

    /**
     * @param parentShell
     * @param repository
     * @param mergeResult
     */
    public MergeResultDialog(Shell parentShell, Repository repository, MergeResult mergeResult) {
        super(parentShell);
        setShellStyle(getShellStyle() | SWT.RESIZE);
        this.repository = repository;
        this.mergeResult = mergeResult;
        objectReader = repository.newObjectReader();
    }

    @Override
    protected void createButtonsForButtonBar(final Composite parent) {
        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
    }

    @Override
    public Control createDialogArea(final Composite parent) {
        final Composite composite = (Composite) super.createDialogArea(parent);
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 2;
        composite.setLayout(gridLayout);
        // result
        Label resultLabel = new Label(composite, SWT.NONE);
        resultLabel.setText(UIText.MergeResultDialog_result);
        resultLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
        Text resultText = new Text(composite, SWT.READ_ONLY);
        resultText.setText(mergeResult.getMergeStatus().toString());
        resultText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        // new head
        Label newHeadLabel = new Label(composite, SWT.NONE);
        newHeadLabel.setText(UIText.MergeResultDialog_newHead);
        newHeadLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
        Text newHeadText = new Text(composite, SWT.READ_ONLY);
        ObjectId newHead = mergeResult.getNewHead();
        if (newHead != null)
            newHeadText.setText(getCommitMessage(newHead) + SPACE + abbreviate(mergeResult.getNewHead(), true));
        newHeadText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        // Merge Input
        Label mergeInputLabel = new Label(composite, SWT.NONE);
        mergeInputLabel.setText(UIText.MergeResultDialog_mergeInput);
        GridDataFactory.fillDefaults().align(SWT.LEAD, SWT.CENTER).span(2, 1).applyTo(mergeInputLabel);
        TableViewer viewer = new TableViewer(composite);
        viewer.setContentProvider(new IStructuredContentProvider() {

            public void dispose() {
                // empty
            }

            public void inputChanged(Viewer theViewer, Object oldInput, Object newInput) {
                // empty
            }

            public Object[] getElements(Object inputElement) {
                return mergeResult.getMergedCommits();
            }
        });
        TableViewerColumn idColumn = new TableViewerColumn(viewer, SWT.LEFT);
        idColumn.getColumn().setText(UIText.MergeResultDialog_id);
        idColumn.getColumn().setWidth(100);
        TableViewerColumn textColumn = new TableViewerColumn(viewer, SWT.LEFT);
        textColumn.getColumn().setText(UIText.MergeResultDialog_description);
        textColumn.getColumn().setWidth(300);
        Table table = viewer.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        viewer.setLabelProvider(new ITableLabelProvider() {

            public void removeListener(ILabelProviderListener listener) {
                // empty
            }

            public boolean isLabelProperty(Object element, String property) {
                return false;
            }

            public void dispose() {
                // empty
            }

            public void addListener(ILabelProviderListener listener) {
                // empty
            }

            public String getColumnText(Object element, int columnIndex) {
                ObjectId commitId = (ObjectId) element;
                if (columnIndex == 0)
                    return abbreviate(commitId, false);
                else if (columnIndex == 1)
                    return getCommitMessage(commitId);
                return EMPTY;
            }

            public Image getColumnImage(Object element, int columnIndex) {
                return null;
            }
        });
        applyDialogFont(composite);
        GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).span(2, 1)
                .applyTo(viewer.getControl());
        viewer.setInput(mergeResult);
        return composite;
    }

    private String getCommitMessage(ObjectId id) {
        RevCommit commit;
        try {
            commit = new RevWalk(repository).parseCommit(id);
        } catch (IOException e) {
            Activator.logError(UIText.MergeResultDialog_couldNotFindCommit, e);
            return UIText.MergeResultDialog_couldNotFindCommit;
        }
        return commit.getShortMessage();
    }

    private String abbreviate(ObjectId id, boolean addBrackets) {
        StringBuilder result = new StringBuilder(EMPTY);
        if (addBrackets)
            result.append("["); //$NON-NLS-1$
        try {
            result.append(objectReader.abbreviate(id).name());
        } catch (IOException e) {
            result.append(id.name());
        }
        if (addBrackets)
            result.append("]"); //$NON-NLS-1$
        return result.toString();
    }

    @Override
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setText(UIText.MergeResultDialog_mergeResult);
        newShell.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                if (objectReader != null)
                    objectReader.release();
            }
        });
    }
}