blob: 6edb7c2b274e1165daed621d7a578be67cd7c293 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.egit.internal.relengtools;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.CompareEditorInput;
import org.eclipse.compare.ResourceNode;
import org.eclipse.compare.structuremergeviewer.DiffNode;
import org.eclipse.compare.structuremergeviewer.Differencer;
import org.eclipse.compare.structuremergeviewer.IDiffElement;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.egit.core.GitTag;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
/**
* This class extends
* <code>CompareEditorInput<code>. It defines the input for map file compare editor, which is showed by
* <code>MapFileComparePage<code>
*/
public class MapFileCompareEditorInput extends CompareEditorInput {
private MapContentDocument[] documents;
private DiffNode root;
private Viewer viewer;
private MapProject mapProject;
private IProject[] selectedProjects;
private String tag; // The proposed tag
public MapFileCompareEditorInput() {
super(new CompareConfiguration());
documents = new MapContentDocument[0];
root = new DiffNode(Differencer.NO_CHANGE) {
@Override
public boolean hasChildren() {
return true;
}
};
mapProject = null;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.compare.CompareEditorInput#prepareInput(org.eclipse.core.
* runtime.IProgressMonitor)
*/
@Override
protected Object prepareInput(IProgressMonitor monitor)
throws InvocationTargetException, InterruptedException {
final CompareConfiguration config = getCompareConfiguration();
config.setRightEditable(false);
config.setLeftEditable(false);
config.setRightLabel("Proposed change");
config.setLeftLabel("Current content");
return root;
}
public void updateInput(IProject[] projects, String tag)
throws CoreException {
setSelectedProjects(projects);
setTag(tag);
final MapContentDocument[] docs = constructDocuments();
setDocuments(docs);
buildTree();
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.compare.CompareEditorInput#createDiffViewer(org.eclipse.swt
* .widgets.Composite)
*/
@Override
public Viewer createDiffViewer(Composite parent) {
viewer = super.createDiffViewer(parent);
viewer.setInput(this);
return viewer;
}
public void updateMapProject(MapProject m) {
mapProject = m;
}
private void setDocuments(MapContentDocument[] docs) {
this.documents = docs;
}
private void buildTree() {
if (documents == null || documents.length == 0)
return;
// Empty the tree
if (root.hasChildren()) {
final IDiffElement[] children = root.getChildren();
for (int i = 0; i < children.length; i++) {
root.remove(children[i]);
}
}
// rebuild the tree
final DiffNode[] diffNodes = new DiffNode[documents.length];
for (int i = 0; i < diffNodes.length; i++) {
final ResourceNode resourceNode = new ResourceNode(documents[i]
.getMapFile().getFile()) {
@Override
public boolean isEditable() {
return false;
}
};
diffNodes[i] = new DiffNode(root, Differencer.CHANGE, null,
resourceNode, documents[i]) {
@Override
public Image getImage() {
return getLeft().getImage();
}
};
}
viewer.refresh();
}
/*
* Returns the map files that will change due to the projects being released
*/
private MapFile[] getChangedMapFiles() {
if (selectedProjects == null || selectedProjects.length == 0)
return null;
final List projectList = new ArrayList();
final GitTag[] tags = mapProject.getTagsFor(selectedProjects);
for (int i = 0; i < selectedProjects.length; i++) {
if (!tags[i].getName().equals(tag)) {
projectList.add(selectedProjects[i]);
}
}
final IProject[] projects = (IProject[]) projectList
.toArray(new IProject[projectList.size()]);
return mapProject.getMapFilesFor(projects);
}
// Construct the document as the diffNode.
private MapContentDocument[] constructDocuments() throws CoreException {
final MapFile[] mapFiles = getChangedMapFiles();
if (mapFiles == null || mapFiles.length == 0)
return null;
final MapContentDocument[] docs = new MapContentDocument[mapFiles.length];
for (int i = 0; i < mapFiles.length; i++) {
docs[i] = new MapContentDocument(mapFiles[i]);
for (int j = 0; j < selectedProjects.length; j++) {
// update the new content of each selected projects
if (mapFiles[i].contains(selectedProjects[j])) {
docs[i].updateTag(selectedProjects[j], tag);
}
}
}
return docs;
}
private void setSelectedProjects(IProject[] projects) {
if (projects != null && projects.length != 0) {
selectedProjects = new IProject[projects.length];
System.arraycopy(projects, 0, selectedProjects, 0, projects.length);
}
}
private void setTag(String t) {
this.tag = t;
}
}