/*******************************************************************************
* Copyright (C) 2013, 2016 Stephen Elsemore <selsemore@collab.net> 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
*******************************************************************************/
package org.eclipse.egit.ui.internal.staging;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.egit.core.internal.util.ResourceUtil;
import org.eclipse.egit.ui.internal.decorators.IProblemDecoratable;
import org.eclipse.jgit.annotations.NonNull;
/**
* A staged/unstaged folder entry in the tree
*/
public class StagingFolderEntry implements IAdaptable, IProblemDecoratable {
private final IPath repoLocation;
private final IPath repoRelativePath;
private final IPath nodePath;
private final IContainer container;
private StagingFolderEntry parent;
private Object[] children;
/**
* @param repoLocation
* @param repoRelativePath
* @param nodePath
*/
public StagingFolderEntry(IPath repoLocation, IPath repoRelativePath,
IPath nodePath) {
this.repoLocation = repoLocation;
this.repoRelativePath = repoRelativePath;
this.nodePath = nodePath;
this.container = ResourceUtil.getContainerForLocation(getLocation(),
false);
}
/**
* @return the container corresponding to the entry, if it exists in the
* workspace, null otherwise.
*/
public IContainer getContainer() {
return container;
}
@Override
public int getProblemSeverity() {
if (container == null)
return SEVERITY_NONE;
try {
return container.findMaxProblemSeverity(IMarker.PROBLEM, true,
IResource.DEPTH_INFINITE);
} catch (CoreException e) {
return SEVERITY_NONE;
}
}
@Override
public Object getAdapter(Class adapter) {
if (adapter == IResource.class || adapter == IContainer.class)
return getContainer();
else if (adapter == IPath.class)
return getLocation();
return null;
}
/**
* @return the repo-relative path of this folder
*/
public IPath getPath() {
return repoRelativePath;
}
/**
* @return the absolute path corresponding to the folder entry
*/
@SuppressWarnings("null")
@NonNull
public IPath getLocation() {
return repoLocation.append(repoRelativePath);
}
/**
* @return the path of the node, relative to its parent
*/
public IPath getNodePath() {
return nodePath;
}
/**
* @return the parent folder entry
*/
public StagingFolderEntry getParent() {
return parent;
}
/**
* @param parent
*/
public void setParent(StagingFolderEntry parent) {
this.parent = parent;
}
/**
* @return child nodes (files or folders)
*/
public Object[] getChildren() {
return children;
}
/**
* @param children
*/
public void setChildren(Object[] children) {
this.children = children;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof StagingFolderEntry)
return ((StagingFolderEntry) obj).getLocation().equals(getLocation());
return super.equals(obj);
}
@Override
public int hashCode() {
return getLocation().hashCode();
}
@Override
public String toString() {
return "StagingFolderEntry[" + repoRelativePath + "]"; //$NON-NLS-1$//$NON-NLS-2$
}
}