diff options
author | cvs2svn | 2003-02-25 01:42:14 +0000 |
---|---|---|
committer | cvs2svn | 2003-02-25 01:42:14 +0000 |
commit | f3a72d7ae15c515a3dad8679e59230c3ed89b3e8 (patch) | |
tree | a653486d581fa03e67e24c0c2177be7ea95cf1e1 | |
parent | 6d601ad8d20f872f37a39125f5d1dc92d975eab5 (diff) | |
download | org.eclipse.cdt-f3a72d7ae15c515a3dad8679e59230c3ed89b3e8.tar.gz org.eclipse.cdt-f3a72d7ae15c515a3dad8679e59230c3ed89b3e8.tar.xz org.eclipse.cdt-f3a72d7ae15c515a3dad8679e59230c3ed89b3e8.zip |
This commit was manufactured by cvs2svn to create branch 'NewParser1'.
Cherrypick from master 2003-02-25 01:42:13 UTC Alain Magloire <alain@qnx.com> 'Reorginaze import to remove warnings.':
core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementContentProvider.java
core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementLabelProvider.java
-rw-r--r-- | core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementContentProvider.java | 293 | ||||
-rw-r--r-- | core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementLabelProvider.java | 164 |
2 files changed, 457 insertions, 0 deletions
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementContentProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementContentProvider.java new file mode 100644 index 00000000000..f9a151acd7a --- /dev/null +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementContentProvider.java @@ -0,0 +1,293 @@ +package org.eclipse.cdt.ui; + +/* + * (c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + */ + + +import org.eclipse.cdt.core.model.CModelException; +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.model.ElementChangedEvent; +import org.eclipse.cdt.core.model.IArchive; +import org.eclipse.cdt.core.model.IBinary; +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ICElementDelta; +import org.eclipse.cdt.core.model.ICFile; +import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.model.ICRoot; +import org.eclipse.cdt.core.model.IElementChangedListener; +import org.eclipse.cdt.core.model.IParent; +import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.cdt.internal.ui.BaseCElementContentProvider; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.StructuredViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.widgets.Control; + +public class CElementContentProvider extends BaseCElementContentProvider implements ITreeContentProvider, IElementChangedListener { + + protected StructuredViewer fViewer; + protected Object fInput; + + /* (non-Cdoc) + * Method declared on IContentProvider. + */ + public void dispose() { + super.dispose(); + CoreModel.getDefault().removeElementChangedListener(this); + } + + /* (non-Cdoc) + * Method declared on IContentProvider. + */ + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + + super.inputChanged(viewer, oldInput, newInput); + + fViewer = (StructuredViewer)viewer; + + if (oldInput == null && newInput != null) { + if (newInput instanceof ICRoot) + CoreModel.getDefault().addElementChangedListener(this); + } else if (oldInput != null && newInput == null) { + CoreModel.getDefault().removeElementChangedListener(this); + } + fInput= newInput; + } + + /** + * Creates a new content provider for C elements. + */ + public CElementContentProvider() { + } + + /** + * Creates a new content provider for C elements. + */ + public CElementContentProvider(boolean provideMembers, boolean provideWorkingCopy) { + super(provideMembers, provideWorkingCopy); + } + + /* (non-Cdoc) + * Method declared on IElementChangedListener. + */ + public void elementChanged(final ElementChangedEvent event) { + try { + processDelta(event.getDelta()); + } catch(CModelException e) { + CUIPlugin.getDefault().log(e); + e.printStackTrace(); + } + } + + /** + * Processes a delta recursively. When more than two children are affected the + * tree is fully refreshed starting at this node. The delta is processed in the + * current thread but the viewer updates are posted to the UI thread. + */ + protected void processDelta(ICElementDelta delta) throws CModelException { + int kind= delta.getKind(); + int flags= delta.getFlags(); + ICElement element= delta.getElement(); + + //System.out.println("Processing " + element); + // handle open and closing of a solution or project + if (((flags & ICElementDelta.F_CLOSED) != 0) + || ((flags & ICElementDelta.F_OPENED) != 0)) { + postRefresh(element); + } + + if (kind == ICElementDelta.REMOVED) { + Object parent = getParent(element); + postRemove(element); + if (element instanceof ICFile) { + ICFile cfile = (ICFile)element; + if (updateContainer(cfile)) { + postRefresh(parent); + } + } + } + + if (kind == ICElementDelta.ADDED) { + Object parent= getParent(element); + postAdd(parent, element); + if (element instanceof ICFile) { + ICFile cfile = (ICFile)element; + if (updateContainer(cfile)) { + postRefresh(parent); + } + } + } + + if (kind == ICElementDelta.CHANGED) { + if ((flags & ICElementDelta.F_BINARY_PARSER_CHANGED) != 0) { + // throw the towel and do a full refresh of the affected C project. + postRefresh(element.getCProject()); + return; + } else if (element instanceof ITranslationUnit || + element instanceof IBinary || element instanceof IArchive) { + postRefresh(element); + return; + } + + } + + ICElementDelta[] affectedChildren= delta.getAffectedChildren(); + for (int i= 0; i < affectedChildren.length; i++) { + processDelta(affectedChildren[i]); + } + + // Make sure that containers are updated. + //if (element instanceof ICRoot) { + // updateContainer((ICRoot)element); + //} + } + + private void updateContainer(ICRoot root) { + postRunnable(new Runnable() { + public void run () { + Control ctrl= fViewer.getControl(); + if (ctrl != null && !ctrl.isDisposed()) { + IStructuredSelection s = (IStructuredSelection)fViewer.getSelection(); + if (s.isEmpty()) + return; + Object element = s.getFirstElement(); + if (element instanceof ICProject) { + updateContainer((ICProject)element); + } + } + } + }); + } + + protected boolean updateContainer(ICProject cproject) { + IParent binContainer = cproject.getBinaryContainer(); + IParent libContainer = cproject.getArchiveContainer(); + if (binContainer != null) { + postContainerRefresh(binContainer, cproject); + } + if (libContainer != null) { + postContainerRefresh(libContainer, cproject); + } + return false; + } + + private boolean updateContainer(ICFile cfile) { + IParent container = null; + ICProject cproject = null; + if (cfile.isBinary()) { + IBinary bin = (IBinary)cfile; + if (bin.isExecutable() || bin.isSharedLib()) { + cproject = bin.getCProject(); + container = cproject.getBinaryContainer(); + } + } else if (cfile.isArchive()) { + cproject = cfile.getCProject(); + container = cproject.getArchiveContainer(); + } + if (container != null) { + postContainerRefresh(container, cproject); + return true; + } + return false; + } + + private void postContainerRefresh(final IParent container, final ICProject cproject) { + //System.out.println("UI Container:" + cproject + " " + container); + postRunnable(new Runnable() { + public void run () { + Control ctrl= fViewer.getControl(); + if (ctrl != null && !ctrl.isDisposed()) { + if (container.hasChildren()) { + if (fViewer.testFindItem(container) != null) { + fViewer.refresh(container); + } else { + fViewer.refresh(cproject); + } + } else { + fViewer.refresh(cproject); + } + } + } + }); + } + + private void postRefresh(final Object root) { + //System.out.println("UI refresh:" + root); + postRunnable(new Runnable() { + public void run() { + // 1GF87WR: ITPUI:ALL - SWTEx + NPE closing a workbench window. + Control ctrl= fViewer.getControl(); + if (ctrl != null && !ctrl.isDisposed()) + fViewer.refresh(root); + } + }); + } + + private void postAdd(final Object parent, final Object element) { + //System.out.println("UI add:" + parent + " " + element); + postRunnable(new Runnable() { + public void run() { + // 1GF87WR: ITPUI:ALL - SWTEx + NPE closing a workbench window. + Control ctrl= fViewer.getControl(); + if (ctrl != null && !ctrl.isDisposed()) +// fViewer.add(parent, element); + fViewer.refresh(parent); + } + }); + } + + private void postRemove(final Object element) { + //System.out.println("UI remove:" + element); + postRunnable(new Runnable() { + public void run() { + // 1GF87WR: ITPUI:ALL - SWTEx + NPE closing a workbench window. + Control ctrl= fViewer.getControl(); + if (ctrl != null && !ctrl.isDisposed()) +// fViewer.remove(element); + fViewer.refresh(getParent(element)); + } + }); + } + + private void postRunnable(final Runnable r) { + Control ctrl= fViewer.getControl(); + if (ctrl != null && !ctrl.isDisposed()) + ctrl.getDisplay().asyncExec(r); + } + + /** + * The workbench has changed. Process the delta and issue updates to the viewer, + * inside the UI thread. + * + * @see IResourceChangeListener#resourceChanged + */ + //public void resourceChanged(final IResourceChangeEvent event) { + // final IResourceDelta delta = event.getDelta(); + // Control ctrl = viewer.getControl(); + // if (ctrl != null && !ctrl.isDisposed()) { + // ctrl.getDisplay().syncExec(new Runnable() { + // public void run() { + // processDelta(delta); + // } + // }); + // } + //} + + + /** + * Returns the implementation of IWorkbenchAdapter for the given + * object. Returns null if the adapter is not defined or the + * object is not adaptable. + */ + protected ICElement getAdapter(Object o) { + if (!(o instanceof IAdaptable)) { + return null; + } + return (ICElement)((IAdaptable)o).getAdapter(ICElement.class); + } + +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementLabelProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementLabelProvider.java new file mode 100644 index 00000000000..81f5625de04 --- /dev/null +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementLabelProvider.java @@ -0,0 +1,164 @@ +package org.eclipse.cdt.ui; + +/* + * (c) Copyright IBM Corp. 2000, 2001. + * All Rights Reserved. + */ + +import org.eclipse.cdt.core.model.IBinary; +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ICFile; +import org.eclipse.cdt.internal.ui.CElementImageProvider; +import org.eclipse.cdt.internal.ui.ErrorTickAdornmentProvider; +import org.eclipse.cdt.internal.ui.IAdornmentProvider; +import org.eclipse.jface.resource.ImageRegistry; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.swt.graphics.Image; +import org.eclipse.ui.model.WorkbenchLabelProvider; + +/** + * The label provider for the c model elements. + */ +public class CElementLabelProvider extends LabelProvider { + + private ImageRegistry fImageRegistry; + private WorkbenchLabelProvider fWorkbenchLabelProvider; + + private CElementImageProvider fImageLabelProvider; + + private IAdornmentProvider[] fAdornmentProviders; + + private int fImageFlags; + private int fTextFlags; + + public CElementLabelProvider() { + this(0 /* CElementLabels.M_PARAMETER_TYPES */, CElementImageProvider.OVERLAY_ICONS, null); + } + + /** + * @param textFlags Flags defined in <code>JavaElementLabels</code>. + * @param imageFlags Flags defined in <code>JavaElementImageProvider</code>. + */ + public CElementLabelProvider(int textFlags, int imageFlags, IAdornmentProvider[] adormentProviders) { + fImageRegistry= CUIPlugin.getDefault().getImageRegistry(); + fWorkbenchLabelProvider= new WorkbenchLabelProvider(); + + fImageLabelProvider= new CElementImageProvider(); + fAdornmentProviders= adormentProviders; + + fImageFlags= imageFlags; + fTextFlags= textFlags; + } + + /** + * @see ILabelProvider#getText + */ + public String getText(Object element) { + if (element instanceof ICElement) { + ICElement celem= (ICElement)element; + + String name= celem.getElementName(); + if (celem.getElementType() == ICElement.C_FUNCTION) { + name += "()"; + } else if(celem.getElementType() == ICElement.C_FUNCTION_DECLARATION) { + name += "();"; + } + if (celem instanceof IBinary) { + IBinary bin = (IBinary)celem; + name += " - [" + bin.getCPU() + (bin.isLittleEndian() ? "le" : "be") + "]"; + } + return name; + } + return fWorkbenchLabelProvider.getText(element); + } + + /** + * @see ILabelProvider#getImage + */ + public Image getImage(Object element) { + int imageFlags= getImageFlags(); + if (fAdornmentProviders != null) { + for (int i= 0; i < fAdornmentProviders.length; i++) { + imageFlags |= fAdornmentProviders[i].computeAdornmentFlags(element); + } + } + + if(element instanceof ICElement) { + Image result= fImageLabelProvider.getImageLabel(element, imageFlags); + if (result != null) { + return result; + } + } + if(element instanceof ICFile) { + //element = ((ICFile)element).getFile(); + } + return fWorkbenchLabelProvider.getImage(element); + + } + + /** + * @see IBaseLabelProvider#dispose() + */ + public void dispose() { + if (fAdornmentProviders != null) { + for (int i= 0; i < fAdornmentProviders.length; i++) { + fAdornmentProviders[i].dispose(); + } + } + if (fWorkbenchLabelProvider != null) { + fWorkbenchLabelProvider.dispose(); + fWorkbenchLabelProvider= null; + } + fImageRegistry= null; + if(fImageLabelProvider != null) { + fImageLabelProvider.dispose(); + } + } + + /** + * Sets the textFlags. + * @param textFlags The textFlags to set + */ + public void setTextFlags(int textFlags) { + fTextFlags= textFlags; + } + + /** + * Sets the imageFlags + * @param imageFlags The imageFlags to set + */ + public void setImageFlags(int imageFlags) { + fImageFlags= imageFlags; + } + + /** + * Gets the image flags. + * Can be overwriten by super classes. + * @return Returns a int + */ + public int getImageFlags() { + return fImageFlags; + } + + /** + * Gets the text flags. Can be overwriten by super classes. + * @return Returns a int + */ + public int getTextFlags() { + return fTextFlags; + } + + public static IAdornmentProvider[] getAdornmentProviders(boolean errortick, IAdornmentProvider extra) { + if (errortick) { + if (extra == null) { + return new IAdornmentProvider[] { new ErrorTickAdornmentProvider() }; + } else { + return new IAdornmentProvider[] { new ErrorTickAdornmentProvider(), extra }; + } + } + if (extra != null) { + return new IAdornmentProvider[] { extra }; + } + return null; + } +} |