/*******************************************************************************
* Copyright (c) 2009, 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
* Zend Technologies
* Dawid PakuĊa [469503]
*******************************************************************************/
package org.eclipse.php.internal.ui.explorer;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.dltk.core.*;
import org.eclipse.dltk.core.environment.EnvironmentPathUtils;
import org.eclipse.dltk.internal.core.ExternalProjectFragment;
import org.eclipse.dltk.internal.ui.navigator.ScriptExplorerContentProvider;
import org.eclipse.dltk.internal.ui.navigator.ScriptExplorerLabelProvider;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.php.core.libfolders.LibraryFolderManager;
import org.eclipse.php.internal.core.includepath.IncludePath;
import org.eclipse.php.internal.core.language.LanguageModelInitializer;
import org.eclipse.php.internal.ui.PHPUiPlugin;
import org.eclipse.php.internal.ui.util.LabelProviderUtil;
import org.eclipse.php.internal.ui.util.PHPPluginImages;
import org.eclipse.swt.graphics.Image;
/**
*
* @author apeled, nirc
*
*/
public class PHPExplorerLabelProvider extends ScriptExplorerLabelProvider {
public PHPExplorerLabelProvider(ScriptExplorerContentProvider cp, IPreferenceStore store) {
super(cp, store == null ? PHPUiPlugin.getDefault().getPreferenceStore() : store);
super.setIsFlatLayout(false);
}
@Override
public void setIsFlatLayout(boolean state) {
super.setIsFlatLayout(false);
}
@Override
public Image getImage(Object element) {
IModelElement modelElement = null;
if (element instanceof ExternalProjectFragment) {
return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_LIBRARY);
}
if (element instanceof IncludePath) {
Object entry = ((IncludePath) element).getEntry();
// An included PHP project
if (entry instanceof IBuildpathEntry) {
int entryKind = ((IBuildpathEntry) entry).getEntryKind();
if (entryKind == IBuildpathEntry.BPE_PROJECT) {
return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_PHP_PROJECT);
}
// A library
if (entryKind == IBuildpathEntry.BPE_LIBRARY || entryKind == IBuildpathEntry.BPE_CONTAINER) {
return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_LIBRARY);
}
}
if (entry instanceof ExternalProjectFragment) {
return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_LIBRARY);
}
// Folder in the include path, should have same image as in the PHP
// Explorer .
if (entry instanceof IFolder) {
IModelElement createdScriptFolder = DLTKCore.create((IFolder) entry);
if (null == createdScriptFolder)
return getImage(entry);
return getImage(createdScriptFolder);
}
if (entry instanceof IResource) {
return (getImage((IResource) entry));
}
return null;
}
if (element instanceof IResource) {
modelElement = DLTKCore.create((IResource) element);
} else if (element instanceof IModelElement) {
modelElement = (IModelElement) element;
}
if (modelElement != null) {
IScriptProject project = modelElement.getScriptProject();
if (!project.isOnBuildpath(modelElement)) {// not in build path,
// hence: hollow,
// non-pakg icons
if (modelElement.getElementType() == IModelElement.SOURCE_MODULE)
return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_CUNIT_RESOURCE);
if (modelElement.getElementType() == IModelElement.PROJECT_FRAGMENT
|| modelElement.getElementType() == IModelElement.SCRIPT_FOLDER)
return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_PHP_FOLDER);
} else {// in build path ...
if (modelElement.getElementType() == IModelElement.PROJECT_FRAGMENT
|| modelElement.getElementType() == IModelElement.SCRIPT_FOLDER || element instanceof IFolder) {
LibraryFolderManager lfm = LibraryFolderManager.getInstance();
if (lfm.isInLibraryFolder(modelElement.getResource())) {
return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_PHP_LIBFOLDER);
} else {
return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_PHPFOLDER_ROOT);
}
}
}
}
if (element != null) {
for (ILabelProvider provider : TreeContentProviderRegistry.getInstance().getLabelProviders()) {
Image image = provider.getImage(element);
if (image != null) {
return image;
}
}
}
return super.getImage(element);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.dltk.internal.ui.navigator.ScriptExplorerLabelProvider#
* getText (java.lang.Object)
*
* Override the default text - do not display a full path for a folder
*/
@Override
public String getText(Object element) {
String label = doGetText(element);
if (label != null) {
return label;
}
return super.getText(element);
}
@Override
public StyledString getStyledText(Object element) {
String label = doGetText(element);
if (label != null) {
return new StyledString(label);
}
return super.getStyledText(element);
}
private String doGetText(Object element) {
if (element instanceof ExternalProjectFragment) {
ExternalProjectFragment fragment = (ExternalProjectFragment) element;
String name = LanguageModelInitializer.getPathName(EnvironmentPathUtils.getLocalPath(fragment.getPath()));
if (name != null) {
return name;
}
return fragment.toStringWithAncestors();
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=295256
if (element instanceof IProjectFragment) {
IProjectFragment fragment = (IProjectFragment) element;
return fragment.getElementName();
}
// end
if (element instanceof IncludePath) {
Object entry = ((IncludePath) element).getEntry();
// An included PHP project
if (entry instanceof IBuildpathEntry) {
IBuildpathEntry iBuildpathEntry = (IBuildpathEntry) entry;
if (iBuildpathEntry.getEntryKind() == IBuildpathEntry.BPE_PROJECT) {
return iBuildpathEntry.getPath().lastSegment();
}
if (iBuildpathEntry.getEntryKind() == IBuildpathEntry.BPE_CONTAINER) {
return getEntryDescription(element, iBuildpathEntry);
} else {
String result = LabelProviderUtil.getVariableName(iBuildpathEntry.getPath(),
iBuildpathEntry.getEntryKind());
if (result == null) {
IPath localPath = EnvironmentPathUtils.getLocalPath(iBuildpathEntry.getPath());
return localPath.toOSString();
}
return result;
}
}
if (entry instanceof ExternalProjectFragment) {
return ((ExternalProjectFragment) entry).toStringWithAncestors();
}
if (entry instanceof IResource) {
return (((IResource) entry).getFullPath().toString()).substring(1);
}
return null;
}
if (element != null) {
for (ILabelProvider provider : TreeContentProviderRegistry.getInstance().getLabelProviders()) {
String label = provider.getText(element);
if (label != null) {
return label;
}
}
}
return null;
}
/**
* @param element
* @param iBuildpathEntry
* @return the name of the container description
*/
private String getEntryDescription(Object element, IBuildpathEntry iBuildpathEntry) {
IProject project = ((IncludePath) element).getProject();
IScriptProject scriptProject = DLTKCore.create(project);
IBuildpathContainer buildpathContainer = null;
try {
buildpathContainer = DLTKCore.getBuildpathContainer(iBuildpathEntry.getPath(), scriptProject);
} catch (ModelException e) {
// no matching container - return the path
}
if (buildpathContainer != null) {
return buildpathContainer.getDescription();
}
return iBuildpathEntry.getPath().toOSString();
}
}