blob: 244bad520762a7e83f736c19b4362c34eb22d873 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2016 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.releng.tools;
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.IProgressMonitor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.team.internal.ccvs.core.CVSException;
import org.eclipse.team.internal.ccvs.core.CVSTag;
import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
/**
* 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;
}
@Override
protected Object prepareInput(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
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) {
setSelectedProjects(projects);
setTag(tag);
MapContentDocument[] docs = constructDocuments();
setDocuments(docs);
buildTree();
}
@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()){
IDiffElement[] children = root.getChildren();
for(int i = 0; i < children.length; i++){
root.remove(children[i]);
}
}
//rebuild the tree
DiffNode[] diffNodes = new DiffNode[documents.length];
for (int i = 0; i < diffNodes.length; i++){
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;
List<IProject> projectList = new ArrayList<>();
CVSTag[] tags = mapProject.getTagsFor(selectedProjects );
for(int i = 0; i < selectedProjects.length; i++){
if(!tags[i].getName().equals(tag)){
projectList.add(selectedProjects[i]);
}
}
IProject [] projects = projectList.toArray(new IProject[projectList.size()]);
return mapProject.getMapFilesFor(projects);
}
//Construct the document as the diffNode.
private MapContentDocument [] constructDocuments(){
MapFile[] mapFiles = getChangedMapFiles();
if(mapFiles == null || mapFiles.length ==0) return null;
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])){
try {
docs[i]. updateTag(selectedProjects[j],tag);
} catch (CVSException e) {
CVSUIPlugin.openError(null, null, null, e);
}
}
}
}
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;
}
}