001: /*******************************************************************************
002: * Copyright (c) 2000, 2007 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.jdt.internal.ui.browsing;
011:
012: import org.eclipse.core.runtime.Assert;
013:
014: import org.eclipse.core.resources.IResource;
015:
016: import org.eclipse.swt.graphics.Image;
017:
018: import org.eclipse.jface.resource.ImageDescriptor;
019:
020: import org.eclipse.jdt.core.IPackageFragment;
021: import org.eclipse.jdt.core.JavaModelException;
022:
023: import org.eclipse.jdt.ui.JavaElementLabels;
024:
025: import org.eclipse.jdt.internal.ui.JavaPlugin;
026: import org.eclipse.jdt.internal.ui.JavaPluginImages;
027: import org.eclipse.jdt.internal.ui.viewsupport.AppearanceAwareLabelProvider;
028: import org.eclipse.jdt.internal.ui.viewsupport.ColoredString;
029: import org.eclipse.jdt.internal.ui.viewsupport.ImageDescriptorRegistry;
030: import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider;
031: import org.eclipse.jdt.internal.ui.viewsupport.TreeHierarchyLayoutProblemsDecorator;
032:
033: /**
034: * Label provider for the Packages view.
035: */
036: class PackagesViewLabelProvider extends AppearanceAwareLabelProvider {
037:
038: static final int HIERARCHICAL_VIEW_STATE = 0;
039: static final int FLAT_VIEW_STATE = 1;
040:
041: private int fViewState;
042:
043: private ImageDescriptorRegistry fRegistry;
044: private TreeHierarchyLayoutProblemsDecorator fDecorator;
045:
046: PackagesViewLabelProvider(int state) {
047: this (state, AppearanceAwareLabelProvider.DEFAULT_TEXTFLAGS
048: | JavaElementLabels.P_COMPRESSED,
049: AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS
050: | JavaElementImageProvider.SMALL_ICONS);
051: }
052:
053: PackagesViewLabelProvider(int state, long textFlags, int imageFlags) {
054: super (textFlags, imageFlags);
055:
056: Assert.isTrue(isValidState(state));
057: fViewState = state;
058: fRegistry = JavaPlugin.getImageDescriptorRegistry();
059:
060: fDecorator = new TreeHierarchyLayoutProblemsDecorator(
061: isFlatView());
062: addLabelDecorator(fDecorator);
063: }
064:
065: private boolean isValidState(int state) {
066: return state == FLAT_VIEW_STATE
067: || state == HIERARCHICAL_VIEW_STATE;
068: }
069:
070: /*
071: * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
072: */
073: public Image getImage(Object element) {
074: if (element instanceof LogicalPackage) {
075: LogicalPackage cp = (LogicalPackage) element;
076: return getLogicalPackageImage(cp);
077: }
078: return super .getImage(element);
079: }
080:
081: /*
082: * Decoration is only concerned with error ticks
083: */
084: private Image getLogicalPackageImage(LogicalPackage cp) {
085: IPackageFragment[] fragments = cp.getFragments();
086: for (int i = 0; i < fragments.length; i++) {
087: IPackageFragment fragment = fragments[i];
088: if (!isEmpty(fragment)) {
089: return decorateCompoundElement(
090: JavaPluginImages.DESC_OBJS_LOGICAL_PACKAGE, cp);
091: }
092: }
093: return decorateCompoundElement(
094: JavaPluginImages.DESC_OBJS_EMPTY_LOGICAL_PACKAGE, cp);
095: }
096:
097: private Image decorateCompoundElement(
098: ImageDescriptor imageDescriptor, LogicalPackage cp) {
099: Image image = fRegistry.get(imageDescriptor);
100: return decorateImage(image, cp);
101: }
102:
103: private boolean isEmpty(IPackageFragment fragment) {
104: try {
105: return (fragment.getCompilationUnits().length == 0)
106: && (fragment.getClassFiles().length == 0);
107: } catch (JavaModelException e) {
108: // ignore
109: }
110: return false;
111: }
112:
113: /*
114: * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
115: */
116: public String getText(Object element) {
117: if (element instanceof IPackageFragment)
118: return getText((IPackageFragment) element);
119: else if (element instanceof LogicalPackage)
120: return getText((LogicalPackage) element);
121: else
122: return super .getText(element);
123: }
124:
125: /* (non-Javadoc)
126: * @see org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider#getRichTextLabel(java.lang.Object)
127: */
128: public ColoredString getRichTextLabel(Object element) {
129: if (element instanceof IPackageFragment
130: || element instanceof LogicalPackage)
131: return new ColoredString(getText(element));
132: return super .getRichTextLabel(element);
133: }
134:
135: private String getText(IPackageFragment fragment) {
136: if (isFlatView())
137: return getFlatText(fragment);
138: else
139: return getHierarchicalText(fragment);
140: }
141:
142: private String getText(LogicalPackage logicalPackage) {
143: IPackageFragment[] fragments = logicalPackage.getFragments();
144: return getText(fragments[0]);
145: }
146:
147: private String getFlatText(IPackageFragment fragment) {
148: return super .getText(fragment);
149: }
150:
151: private boolean isFlatView() {
152: return fViewState == FLAT_VIEW_STATE;
153: }
154:
155: private String getHierarchicalText(IPackageFragment fragment) {
156: if (fragment.isDefaultPackage()) {
157: return super .getText(fragment);
158: }
159: IResource res = fragment.getResource();
160: if (res != null && !(res.getType() == IResource.FILE))
161: return decorateText(res.getName(), fragment);
162: else
163: return decorateText(calculateName(fragment), fragment);
164: }
165:
166: private String calculateName(IPackageFragment fragment) {
167:
168: String name = fragment.getElementName();
169: if (name.indexOf(".") != -1) //$NON-NLS-1$
170: name = name.substring(name.lastIndexOf(".") + 1); //$NON-NLS-1$
171: return name;
172:
173: }
174: }
|