/* * Copyright (c) 2013, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.tools.ui.internal.text.editor; import com.google.dart.tools.ui.DartElementLabelProvider; import com.google.dart.tools.ui.DartElementLabels; import com.google.dart.tools.ui.internal.viewsupport.DartElementImageProvider; import com.google.dart.tools.ui.internal.viewsupport.NewDartElementImageProvider; import com.google.dart.tools.ui.internal.viewsupport.StorageLabelProvider; import org.eclipse.core.resources.IStorage; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider; import org.eclipse.jface.viewers.ILabelDecorator; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StyledString; import org.eclipse.swt.graphics.Image; import java.util.ArrayList; /** * Standard label provider for Dart elements. Use this class when you want to present Dart elements * in a viewer. * <p> * This class may be instantiated; it is not intended to be subclassed. * </p> * <b>NOTE:</b> this will replace {@link DartElementLabelProvider}. */ public class NewDartElementLabelProvider extends LabelProvider implements IStyledLabelProvider { /** * Flag (bit mask) indicating that the label should include overlay icons for element type and * modifiers. */ public final static int SHOW_OVERLAY_ICONS = 0x010; /** * Flag (bit mask) indicating that method label include parameter types. */ public final static int SHOW_PARAMETERS = 0x002; /** * Flag (bit mask) indicating that compilation units, types, declarations and members should be * rendered qualified. The qualification is appended. */ public final static int SHOW_POST_QUALIFIED = 0x800; /** * Flag (bit mask) indicating that compilation units, types, declarations and members should be * rendered qualified. */ public final static int SHOW_QUALIFIED = 0x400; /** * Flag (bit mask) indicating that methods labels include the method return type (appended). */ public final static int SHOW_RETURN_TYPE = 0x001; /** * Flag (bit mask) indicating that the label should include the name of the package fragment root * (appended). */ public final static int SHOW_ROOT = 0x040; /** * Flag (bit mask) indicating that the label should show the icons with no space reserved for * overlays. */ public final static int SHOW_SMALL_ICONS = 0x100; /** * Flag (bit mask) indicating that a field label should include the declared type. */ public final static int SHOW_TYPE = 0x020; /** * Constant (value <code>0</code>) indicating that the label should show the basic images only. */ public final static int SHOW_BASICS = 0x000; /** * Constant indicating the default label rendering. Currently the default is equivalent to * <code>SHOW_PARAMETERS | SHOW_OVERLAY_ICONS | SHOW_RETURN_TYPE</code>. */ public final static int SHOW_DEFAULT = new Integer(SHOW_PARAMETERS | SHOW_OVERLAY_ICONS | SHOW_RETURN_TYPE).intValue(); private long textFlags; private int imageFlags; private final int providedFlags; private StorageLabelProvider storageLabelProvider; private NewDartElementImageProvider imageLabelProvider; private ArrayList<ILabelDecorator> labelDecorators; /** * Creates a new label provider with <code>SHOW_DEFAULT</code> flag. * * @see #SHOW_DEFAULT */ public NewDartElementLabelProvider() { this(SHOW_DEFAULT); } /** * Creates a new label provider. * * @param flags the initial options; a bitwise OR of <code>SHOW_* </code> constants */ public NewDartElementLabelProvider(int flags) { this.providedFlags = flags; imageLabelProvider = new NewDartElementImageProvider(); storageLabelProvider = new StorageLabelProvider(); initImageProviderFlags(); initTextProviderFlags(); } /** * Adds a decorator to the label provider * * @param decorator the decorator to add */ public void addLabelDecorator(ILabelDecorator decorator) { if (labelDecorators == null) { labelDecorators = new ArrayList<ILabelDecorator>(2); } labelDecorators.add(decorator); } @Override public void dispose() { super.dispose(); if (labelDecorators != null) { for (ILabelDecorator decorator : labelDecorators) { decorator.dispose(); } labelDecorators = null; } imageLabelProvider.dispose(); storageLabelProvider.dispose(); } @Override public Image getImage(Object element) { Image result = imageLabelProvider.getImageLabel(element, imageFlags); if (result == null && element instanceof IStorage) { result = storageLabelProvider.getImage(element); } return decorateImage(result, element); } @Override public StyledString getStyledText(Object element) { return new StyledString(getText(element)); } @Override public String getText(Object element) { String result = DartElementLabels.getTextLabel(element, textFlags); return decorateText(result, element); } protected Image decorateImage(Image image, Object element) { if (labelDecorators != null && image != null) { for (ILabelDecorator decorator : labelDecorators) { image = decorator.decorateImage(image, element); } } return image; } protected String decorateText(String text, Object element) { if (labelDecorators != null && text != null && text.length() > 0) { for (ILabelDecorator decorator : labelDecorators) { String decorated = decorator.decorateText(text, element); if (decorated != null) { text = decorated; } } } return text; } private boolean getFlag(int flag) { return (providedFlags & flag) != 0; } private void initImageProviderFlags() { imageFlags = 0; if (getFlag(SHOW_OVERLAY_ICONS)) { imageFlags |= DartElementImageProvider.OVERLAY_ICONS; } if (getFlag(SHOW_SMALL_ICONS)) { imageFlags |= DartElementImageProvider.SMALL_ICONS; } } private void initTextProviderFlags() { textFlags = DartElementLabels.T_TYPE_PARAMETERS; if (getFlag(SHOW_RETURN_TYPE)) { textFlags |= DartElementLabels.M_APP_RETURNTYPE; } if (getFlag(SHOW_PARAMETERS)) { textFlags |= DartElementLabels.M_PARAMETER_TYPES; } if (getFlag(SHOW_TYPE)) { textFlags |= DartElementLabels.F_APP_TYPE_SIGNATURE; } if (getFlag(SHOW_ROOT)) { textFlags |= DartElementLabels.APPEND_ROOT_PATH; } if (getFlag(SHOW_QUALIFIED)) { textFlags |= (DartElementLabels.F_FULLY_QUALIFIED | DartElementLabels.M_FULLY_QUALIFIED | DartElementLabels.I_FULLY_QUALIFIED | DartElementLabels.T_FULLY_QUALIFIED | DartElementLabels.D_QUALIFIED | DartElementLabels.CF_QUALIFIED | DartElementLabels.CU_QUALIFIED); } if (getFlag(SHOW_POST_QUALIFIED)) { textFlags |= (DartElementLabels.F_POST_QUALIFIED | DartElementLabels.M_POST_QUALIFIED | DartElementLabels.I_POST_QUALIFIED | DartElementLabels.T_POST_QUALIFIED | DartElementLabels.D_POST_QUALIFIED | DartElementLabels.CF_POST_QUALIFIED | DartElementLabels.CU_POST_QUALIFIED); } } }