| /******************************************************************************* |
| * 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<IProject>(); |
| 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; |
| } |
| } |