/*******************************************************************************
* Copyright (C) 2011, 2015 Bernard Leach <leachbj@bouncycastle.org> and others.
* Copyright (C) 2015 Denis Zygann <d.zygann@web.de>
*
* 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.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.UIUtils;
import org.eclipse.egit.ui.internal.UIIcons;
import org.eclipse.egit.ui.internal.decorators.DecorationResult;
import org.eclipse.egit.ui.internal.decorators.GitLightweightDecorator.DecorationHelper;
import org.eclipse.egit.ui.internal.staging.StagingView.Presentation;
import org.eclipse.jgit.annotations.Nullable;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.resource.ResourceManager;
import org.eclipse.jface.viewers.DecorationOverlayIcon;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.model.WorkbenchLabelProvider;
/**
* Label provider for {@link StagingEntry} objects
*/
public class StagingViewLabelProvider extends LabelProvider {
private StagingView stagingView;
private WorkbenchLabelProvider workbenchLabelProvider = new WorkbenchLabelProvider();
private final Image FOLDER = PlatformUI.getWorkbench().getSharedImages()
.getImage(ISharedImages.IMG_OBJ_FOLDER);
private final Image SUBMODULE = UIIcons.REPOSITORY.createImage();
private ResourceManager resourceManager = new LocalResourceManager(
JFaceResources.getResources());
private final DecorationHelper decorationHelper = new DecorationHelper(
Activator.getDefault().getPreferenceStore());
private boolean fileNameMode = false;
/**
* @param stagingView
*/
public StagingViewLabelProvider(StagingView stagingView) {
super();
this.stagingView = stagingView;
}
/**
* Set file name mode to be enabled or disabled. This mode displays the
* names of the file first followed by the path to the folder that the file
* is in.
*
* @param enable
* @return this label provider
*/
public StagingViewLabelProvider setFileNameMode(boolean enable) {
fileNameMode = enable;
return this;
}
@Override
public void dispose() {
SUBMODULE.dispose();
this.resourceManager.dispose();
super.dispose();
}
private Image getEditorImage(StagingEntry diff) {
if (diff.isSubmodule()) {
return SUBMODULE;
}
Image image;
if (diff.getPath() != null) {
image = (Image) resourceManager
.get(UIUtils.getEditorImage(diff.getPath()));
} else {
image = (Image) resourceManager.get(UIUtils.DEFAULT_FILE_IMG);
}
if (diff.isSymlink()) {
if (diff.getLocation().toFile().isDirectory()) {
image = FOLDER;
}
image = addSymlinkDecorationToImage(image);
}
return image;
}
private Image getDecoratedImage(Image base, ImageDescriptor decorator) {
DecorationOverlayIcon decorated = new DecorationOverlayIcon(base,
decorator, IDecoration.BOTTOM_RIGHT);
return (Image) this.resourceManager.get(decorated);
}
private Image addSymlinkDecorationToImage(Image base) {
DecorationOverlayIcon decorated = new DecorationOverlayIcon(base,
UIIcons.OVR_SYMLINK, IDecoration.TOP_RIGHT);
return (Image) this.resourceManager.get(decorated);
}
@Override
public Image getImage(Object element) {
if (element instanceof StagingFolderEntry) {
StagingFolderEntry c = (StagingFolderEntry) element;
if (c.getContainer() == null) {
return FOLDER;
}
return workbenchLabelProvider
.getImage(((StagingFolderEntry) element).getContainer());
}
StagingEntry c = (StagingEntry) element;
DecorationResult decoration = new DecorationResult();
decorationHelper.decorate(decoration, c);
return getDecoratedImage(getEditorImage(c), decoration.getOverlay());
}
@Override
public String getText(Object element) {
if (element instanceof StagingFolderEntry) {
StagingFolderEntry stagingFolderEntry = (StagingFolderEntry) element;
return stagingFolderEntry.getNodePath().toString();
}
StagingEntry stagingEntry = getStagingEntry(element);
if (stagingEntry == null) {
return ""; //$NON-NLS-1$
}
final DecorationResult decoration = new DecorationResult();
decorationHelper.decorate(decoration, stagingEntry);
final StyledString styled = new StyledString();
final String prefix = decoration.getPrefix();
final String suffix = decoration.getSuffix();
if (prefix != null)
styled.append(prefix, StyledString.DECORATIONS_STYLER);
if (stagingView.getPresentation() == Presentation.LIST) {
if (fileNameMode) {
IPath parsed = Path.fromOSString(stagingEntry.getPath());
if (parsed.segmentCount() > 1) {
styled.append(parsed.lastSegment());
if (suffix != null)
styled.append(suffix, StyledString.DECORATIONS_STYLER);
styled.append(' ');
styled.append('-', StyledString.QUALIFIER_STYLER);
styled.append(' ');
styled.append(parsed.removeLastSegments(1).toString(),
StyledString.QUALIFIER_STYLER);
} else {
styled.append(stagingEntry.getPath());
if (suffix != null)
styled.append(suffix, StyledString.DECORATIONS_STYLER);
}
} else {
styled.append(stagingEntry.getPath());
if (suffix != null)
styled.append(suffix, StyledString.DECORATIONS_STYLER);
}
} else {
styled.append(stagingEntry.getName());
}
return styled.toString();
}
@Nullable
private StagingEntry getStagingEntry(Object element) {
StagingEntry entry = null;
if (element instanceof StagingEntry) {
entry = (StagingEntry) element;
}
if (element instanceof TreeItem) {
TreeItem item = (TreeItem) element;
if (item.getData() instanceof StagingEntry) {
entry = (StagingEntry) item.getData();
}
}
return entry;
}
}