diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/MakeContentProvider.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/MakeContentProvider.java
index e601ccabe87..d2637679416 100644
--- a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/MakeContentProvider.java
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/MakeContentProvider.java
@@ -46,6 +46,8 @@ import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChang
import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Display;
@@ -63,7 +65,7 @@ public class MakeContentProvider implements ITreeContentProvider, IMakeTargetLis
/** presentation of the content, i.e. for MakeView tree of for BuildTargetDialog table */
protected boolean bFlatten;
- protected TreeViewer viewer;
+ protected StructuredViewer viewer;
/**
* Default constructor.
@@ -196,7 +198,7 @@ public class MakeContentProvider implements ITreeContentProvider, IMakeTargetLis
if (this.viewer == null) {
MakeCorePlugin.getDefault().getTargetManager().addListener(this);
}
- this.viewer = (TreeViewer) viewer;
+ this.viewer = (StructuredViewer) viewer;
IWorkspace oldWorkspace = null;
IWorkspace newWorkspace = null;
if (oldInput instanceof IWorkspace) {
@@ -250,11 +252,23 @@ public class MakeContentProvider implements ITreeContentProvider, IMakeTargetLis
if (viewer == null || viewer.getControl() == null || viewer.getControl().isDisposed())
return;
- if (viewer.getTree().getItemCount() <= 0) {
+ int itemCount = 0;
+ if (viewer instanceof TreeViewer) {
+ ((TreeViewer) viewer).getTree().getItemCount();
+ } else if (viewer instanceof TableViewer) {
+ ((TableViewer) viewer).getTable().getItemCount();
+ }
+ if (itemCount <= 0) {
return;
}
- Object firstItem = viewer.getTree().getItem(0).getData();
+ Object firstItem = null;
+ if (viewer instanceof TreeViewer) {
+ firstItem = ((TreeViewer) viewer).getTree().getItem(0).getData();
+ } else if (viewer instanceof TableViewer) {
+ firstItem = ((TableViewer) viewer).getTable().getItem(0).getData();
+ }
+
IContainer parentContainer = null;
boolean isDrilledDown = !(firstItem instanceof IProject);
diff --git a/core/org.eclipse.cdt.ui/plugin.properties b/core/org.eclipse.cdt.ui/plugin.properties
index b68047862f3..141eebb83c7 100644
--- a/core/org.eclipse.cdt.ui/plugin.properties
+++ b/core/org.eclipse.cdt.ui/plugin.properties
@@ -544,8 +544,6 @@ WriteOccurrenceAnnotation.label= C/C++ Write Occurrences
DocCommentOwner.name = DocCommentOwner
Doxygen.name = Doxygen
-indexedFilesDecorator.label = C/C++ Indexed Files
-
# Hyperlinking
cEditorHyperlinkTarget= C/C++ Editor
cElementHyperlinkDetector= C/C++ Elements
@@ -598,7 +596,12 @@ ShiftRightAction.label= &Shift Right
ShiftLeftAction.label= S&hift Left
# Decorators
-excluded-file.name = C/C++ Files Excluded from Build
+indexedFilesDecorator.label = C/C++ Indexed Files
+indexedFilesDecorator.description = Decorates files indexed by C/C++ Indexer.
+excludedFile.name = C/C++ Files Excluded from Build
+excludedFile.description = Decorates source files excluded from C/C++ build.
+includeFolderDecorator.name = C/C++ Missing Include Folders
+includeFolderDecorator.description = Decorates missing include folders with error/warning indicator.
templatesViewName= Templates
diff --git a/core/org.eclipse.cdt.ui/plugin.xml b/core/org.eclipse.cdt.ui/plugin.xml
index 4098d3c082a..920a027106d 100644
--- a/core/org.eclipse.cdt.ui/plugin.xml
+++ b/core/org.eclipse.cdt.ui/plugin.xml
@@ -4055,6 +4055,7 @@
label="%indexedFilesDecorator.label"
lightweight="true"
state="false">
+ %indexedFilesDecorator.description
@@ -4062,6 +4063,34 @@
+
+ %excludedFile.description
+
+
+
+
+
+ %includeFolderDecorator.description
+
+
+
+
+
+
+
@@ -4259,16 +4288,6 @@
-
-
-
-
-
-
-
0) {
extras = new Object[] {archive};
}
- IBinaryContainer bin = cproject.getBinaryContainer();
+ IBinaryContainer bin = cproject.getBinaryContainer();
if (getExecutables(bin).length > 0) {
Object[] o = new Object[] {bin};
if (extras != null && extras.length > 0) {
@@ -151,7 +152,7 @@ public class CViewContentProvider extends CElementContentProvider {
extras = o;
}
}
-
+
IncludeRefContainer incRefCont = new IncludeRefContainer(cproject);
Object[] incRefs = incRefCont.getChildren(cproject);
if (incRefs != null && incRefs.length > 0) {
@@ -230,17 +231,16 @@ public class CViewContentProvider extends CElementContentProvider {
return (ars != null) && ars.length > 0;
} catch (CModelException e) {
return false;
- }
+ }
} else if (element instanceof IncludeReferenceProxy) {
- IIncludeReference ref = ((IncludeReferenceProxy)element).getReference();
- IPath location = ref.getPath();
- IContainer[] containers = ref.getCModel().getWorkspace().getRoot().findContainersForLocation(location);
- for (int i = 0; i < containers.length; ++i) {
- if (containers[i].isAccessible()) {
- return false;
- }
+ IIncludeReference reference = ((IncludeReferenceProxy)element).getReference();
+ IContainer container = ResourcesPlugin.getWorkspace().getRoot().getContainerForLocation(reference.getPath());
+ if (container != null) {
+ // do not allow to navigate to workspace containers inside "Includes" node
+ return false;
}
+ return reference.hasChildren();
}
return super.hasChildren(element);
}
@@ -266,5 +266,5 @@ public class CViewContentProvider extends CElementContentProvider {
}
super.inputChanged(viewer, oldInput, newInput);
}
-
+
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/cview/CViewLabelProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/cview/CViewLabelProvider.java
index 4d326cd5d05..5608d8a5ef6 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/cview/CViewLabelProvider.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/cview/CViewLabelProvider.java
@@ -21,24 +21,25 @@ import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.swt.graphics.Image;
-import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.IIncludeReference;
import org.eclipse.cdt.core.model.ITranslationUnit;
+import org.eclipse.cdt.core.settings.model.ICSettingEntry;
import org.eclipse.cdt.ui.CDTSharedImages;
import org.eclipse.cdt.ui.CElementImageDescriptor;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.corext.util.Strings;
+import org.eclipse.cdt.internal.ui.newui.LanguageSettingsImages;
import org.eclipse.cdt.internal.ui.viewsupport.AppearanceAwareLabelProvider;
import org.eclipse.cdt.internal.ui.viewsupport.CElementImageProvider;
/*
- * CViewLabelProvider
+ * CViewLabelProvider
*/
public class CViewLabelProvider extends AppearanceAwareLabelProvider {
-
+
public CViewLabelProvider(long textFlags, int imageFlags) {
super(textFlags, imageFlags);
}
@@ -92,14 +93,14 @@ public class CViewLabelProvider extends AppearanceAwareLabelProvider {
p = p.removeFirstSegments(parentLocation.segmentCount());
}
return decorateText(p.toString(), element);
- }
+ }
}
return super.getText(element);
}
-
+
@Override
public StyledString getStyledText(Object element) {
- return Strings.markLTR(new StyledString(getText(element)));
+ return Strings.markLTR(new StyledString(getText(element)));
}
/* (non-Javadoc)
@@ -107,20 +108,28 @@ public class CViewLabelProvider extends AppearanceAwareLabelProvider {
*/
@Override
public Image getImage(Object element) {
+ String imageKey = null;
if (element instanceof IncludeReferenceProxy) {
IIncludeReference reference = ((IncludeReferenceProxy)element).getReference();
- IPath path = reference.getPath();
- IContainer container = reference.getCModel().getWorkspace().getRoot().getContainerForLocation(path);
- if (container != null && container.isAccessible()) {
- ImageDescriptor desc = CDTSharedImages.getImageDescriptor(CDTSharedImages.IMG_OBJS_INCLUDES_FOLDER_WORKSPACE);
- desc = new CElementImageDescriptor(desc, 0, CElementImageProvider.SMALL_SIZE);
- return CUIPlugin.getImageDescriptorRegistry().get(desc);
+ IContainer container = ResourcesPlugin.getWorkspace().getRoot().getContainerForLocation(reference.getPath());
+ if (container != null) {
+ ICProject cproject = reference.getCProject();
+ IProject project = (cproject != null) ? cproject.getProject() : null;
+ boolean isProjectRelative = container.getProject().equals(project);
+ imageKey = LanguageSettingsImages.getImageKey(ICSettingEntry.INCLUDE_PATH, ICSettingEntry.VALUE_WORKSPACE_PATH, isProjectRelative);
+ } else {
+ imageKey = CDTSharedImages.IMG_OBJS_INCLUDES_FOLDER;
}
} else if (element instanceof IIncludeReference) {
- ImageDescriptor desc = CElementImageProvider.getImageDescriptor(ICElement.C_CCONTAINER);
+ imageKey = CDTSharedImages.IMG_OBJS_CFOLDER;
+ }
+
+ if (imageKey != null) {
+ ImageDescriptor desc = CDTSharedImages.getImageDescriptor(imageKey);
desc = new CElementImageDescriptor(desc, 0, CElementImageProvider.SMALL_SIZE);
return CUIPlugin.getImageDescriptorRegistry().get(desc);
}
+
return super.getImage(element);
}
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/newui/LanguageSettingsImages.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/newui/LanguageSettingsImages.java
index 496f8431e40..972f5f68797 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/newui/LanguageSettingsImages.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/newui/LanguageSettingsImages.java
@@ -64,7 +64,7 @@ public class LanguageSettingsImages {
/**
* @return the base key for the image.
*/
- private static String getImageKey(int kind, int flag, boolean isProjectRelative) {
+ public static String getImageKey(int kind, int flag, boolean isProjectRelative) {
String imageKey = null;
boolean isWorkspacePath = (flag & ICSettingEntry.VALUE_WORKSPACE_PATH) != 0;
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/ClassMemberInserter.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/ClassMemberInserter.java
index 04b7f420e38..d64bf24bf0d 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/ClassMemberInserter.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/ClassMemberInserter.java
@@ -5,7 +5,7 @@
* 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:
* Institute for Software - initial API and implementation
* Sergey Prigogin (Google)
@@ -48,10 +48,6 @@ import org.eclipse.cdt.internal.ui.refactoring.utils.VisibilityEnum;
* @author Mirko Stocker
*/
public class ClassMemberInserter {
- private final ICPPASTCompositeTypeSpecifier classNode;
- private final VisibilityEnum visibility;
- private final List nodesToAdd;
- private final ModificationCollector collector;
public static void createChange(ICPPASTCompositeTypeSpecifier classNode,
VisibilityEnum visibility, IASTNode nodeToAdd, boolean isField,
@@ -62,25 +58,12 @@ public class ClassMemberInserter {
public static void createChange(ICPPASTCompositeTypeSpecifier classNode,
VisibilityEnum visibility, List nodesToAdd, boolean isField,
ModificationCollector collector) {
- new ClassMemberInserter(classNode, visibility, nodesToAdd, collector, isField);
- }
-
- private ClassMemberInserter(ICPPASTCompositeTypeSpecifier classNode,
- VisibilityEnum visibility, List nodesToAdd, ModificationCollector collector,
- boolean isField) {
- this.nodesToAdd = new ArrayList(nodesToAdd);
- this.classNode = classNode;
- this.visibility = visibility;
- this.collector = collector;
- createRewrites(isField);
- }
-
- private void createRewrites(boolean isField) {
+ nodesToAdd = new ArrayList(nodesToAdd);
VisibilityEnum defaultVisibility = classNode.getKey() == IASTCompositeTypeSpecifier.k_struct ?
VisibilityEnum.v_public : VisibilityEnum.v_private;
VisibilityEnum currentVisibility = defaultVisibility;
- boolean ascendingVisibilityOrder = isAscendingVisibilityOrder();
+ boolean ascendingVisibilityOrder = isAscendingVisibilityOrder(classNode);
int lastFunctionIndex = -1;
int lastFieldIndex = -1;
int lastMatchingVisibilityIndex = -1;
@@ -134,16 +117,20 @@ public class ClassMemberInserter {
ASTRewrite rewrite = collector.rewriterForTranslationUnit(classNode.getTranslationUnit());
for (IASTNode node : nodesToAdd) {
- rewrite.insertBefore(classNode, nextNode, node, createEditDescription());
+ rewrite.insertBefore(classNode, nextNode, node, createEditDescription(classNode));
}
+ }
+
+ // Not instantiatable. All methods are static.
+ private ClassMemberInserter() {
}
-
- private TextEditGroup createEditDescription() {
+
+ private static TextEditGroup createEditDescription(ICPPASTCompositeTypeSpecifier classNode) {
return new TextEditGroup(NLS.bind(Messages.AddDeclarationNodeToClassChange_AddDeclaration,
classNode.getName()));
}
- private boolean isAscendingVisibilityOrder() {
+ private static boolean isAscendingVisibilityOrder(ICPPASTCompositeTypeSpecifier classNode) {
IPreferencesService preferences = Platform.getPreferencesService();
IASTTranslationUnit ast = classNode.getTranslationUnit();
ITranslationUnit tu = ast.getOriginatingTranslationUnit();
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/IncludeFolderDecorator.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/IncludeFolderDecorator.java
new file mode 100644
index 00000000000..31758daad28
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/IncludeFolderDecorator.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2012 Andrew Gvozdev 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:
+ * Andrew Gvozdev - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.internal.ui.viewsupport;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.preference.JFacePreferences;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ILightweightLabelDecorator;
+
+import org.eclipse.cdt.core.model.IIncludeReference;
+import org.eclipse.cdt.ui.CDTSharedImages;
+
+import org.eclipse.cdt.internal.ui.cview.IncludeReferenceProxy;
+
+/**
+ * Determines whether an include folder under "Includes" node does exist
+ * and if not decorates the file's icon with warning overlay and
+ * renders the label using the qualifier (gray) color.
+ */
+public class IncludeFolderDecorator implements ILightweightLabelDecorator {
+ @Override
+ public void decorate(Object element, IDecoration decoration) {
+ boolean isAccesible = true;
+
+ if (element instanceof IncludeReferenceProxy) {
+ IIncludeReference reference = ((IncludeReferenceProxy)element).getReference();
+ IPath path = reference.getPath();
+ IContainer container = ResourcesPlugin.getWorkspace().getRoot().getContainerForLocation(path);
+ if (container != null) {
+ isAccesible = container.isAccessible();
+ } else {
+ isAccesible = path.toFile().exists();
+ }
+ } else if (element instanceof IIncludeReference) {
+ IPath path = ((IIncludeReference) element).getPath();
+ isAccesible = path.toFile().exists();
+ }
+
+ if (!isAccesible) {
+ decoration.addOverlay(CDTSharedImages.getImageDescriptor(CDTSharedImages.IMG_OVR_WARNING));
+ // JFacePreferences.QUALIFIER_COLOR colors label in gray
+ decoration.setForegroundColor(JFaceResources.getColorRegistry().get(JFacePreferences.QUALIFIER_COLOR));
+ }
+ }
+
+ @Override
+ public void addListener(ILabelProviderListener listener) {
+ // We don't track state changes
+ }
+
+ @Override
+ public void dispose() {
+ }
+
+ @Override
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ @Override
+ public void removeListener(ILabelProviderListener listener) {
+ // We don't track state changes
+ }
+}
\ No newline at end of file