com.aptana.git.ui.internal.actions.DiffHandler.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.git.ui.internal.actions.DiffHandler.java

Source

/**
 * Aptana Studio
 * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
 * Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions).
 * Please see the license.html included with this distribution for details.
 * Any modifications to this file must keep this entire header intact.
 */
package com.aptana.git.ui.internal.actions;

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

import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

import com.aptana.core.logging.IdeLog;
import com.aptana.git.core.IDebugScopes;
import com.aptana.git.core.model.ChangedFile;
import com.aptana.git.core.model.GitRepository;
import com.aptana.git.core.model.IGitRepositoryManager;
import com.aptana.git.ui.DiffFormatter;
import com.aptana.git.ui.GitUIPlugin;
import com.aptana.git.ui.actions.Messages;
import com.aptana.ui.util.SafeMessageDialogRunnable;
import com.aptana.ui.util.UIUtils;

public class DiffHandler extends AbstractGitHandler {

    @Override
    protected boolean calculateEnabled() {
        return !getSelectedChangedFiles().isEmpty();
    }

    private List<ChangedFile> getSelectedChangedFiles() {
        List<ChangedFile> changedFiles = new ArrayList<ChangedFile>();
        IGitRepositoryManager manager = getGitRepositoryManager();
        if (manager == null) {
            return changedFiles;
        }

        GitRepository repo = null;
        for (IResource resource : getSelectedResources()) {
            if (resource == null) {
                continue;
            }

            if (repo == null) {
                repo = manager.getAttached(resource.getProject());
            }
            changedFiles.addAll(getChangedFilesForResource(repo, resource));
        }
        return changedFiles;
    }

    private List<ChangedFile> getChangedFilesForResource(GitRepository repo, IResource resource) {
        List<ChangedFile> files = new ArrayList<ChangedFile>();
        if (repo == null) {
            return files;
        }
        if (resource instanceof IContainer) {
            files.addAll(repo.getChangedFilesForContainer((IContainer) resource));
        } else {
            ChangedFile changedFile = repo.getChangedFileForResource(resource);
            if (changedFile != null) {
                files.add(changedFile);
            }
        }
        return files;
    }

    @Override
    protected Object doExecute(ExecutionEvent event) throws ExecutionException {
        Map<String, String> diffs = new HashMap<String, String>();
        List<ChangedFile> changedFiles = getSelectedChangedFiles();
        if (changedFiles == null || changedFiles.isEmpty()) {
            return null;
        }

        GitRepository repo = getSelectedRepository();
        if (repo == null) {
            return null;
        }
        for (ChangedFile file : changedFiles) {
            if (file == null) {
                continue;
            }

            if (diffs.containsKey(file.getPath())) {
                continue; // already calculated diff...
            }
            String diff = repo.index().diffForFile(file, file.hasStagedChanges(), 3);
            diffs.put(file.getPath(), diff);
        }
        if (diffs.isEmpty()) {
            return null;
        }

        String diff = ""; //$NON-NLS-1$
        try {
            diff = DiffFormatter.toHTML(diffs);
        } catch (Throwable t) {
            IdeLog.logError(GitUIPlugin.getDefault(), "Failed to turn diff into HTML", t, IDebugScopes.DEBUG); //$NON-NLS-1$
        }

        final String finalDiff = diff;
        UIUtils.showMessageDialogFromBgThread(new SafeMessageDialogRunnable() {
            public int openMessageDialog() {
                MessageDialog dialog = new MessageDialog(getShell(), Messages.GitProjectView_GitDiffDialogTitle,
                        null, "", 0, new String[] { IDialogConstants.OK_LABEL }, 0) //$NON-NLS-1$
                {
                    @Override
                    protected Control createCustomArea(Composite parent) {
                        Browser diffArea = new Browser(parent, SWT.BORDER);
                        GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
                        data.heightHint = 300;
                        diffArea.setLayoutData(data);
                        diffArea.setText(finalDiff);
                        return diffArea;
                    }

                    @Override
                    protected boolean isResizable() {
                        return true;
                    }
                };
                return dialog.open();
            }
        });

        return null;
    }

}