| /*=============================================================================# |
| # Copyright (c) 2007, 2019 Stephan Wahlbrink and others. |
| # |
| # This program and the accompanying materials are made available under the |
| # terms of the Eclipse Public License 2.0 which is available at |
| # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 |
| # which is available at https://www.apache.org/licenses/LICENSE-2.0. |
| # |
| # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 |
| # |
| # Contributors: |
| # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation |
| #=============================================================================*/ |
| |
| package org.eclipse.statet.r.ui; |
| |
| import static org.eclipse.statet.ltk.model.core.elements.IModelElement.MASK_C1; |
| import static org.eclipse.statet.ltk.model.core.elements.IModelElement.MASK_C2; |
| import static org.eclipse.statet.ltk.model.core.elements.IModelElement.SHIFT_C1; |
| |
| import java.util.List; |
| |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.jface.viewers.StyledCellLabelProvider; |
| import org.eclipse.jface.viewers.StyledString; |
| import org.eclipse.jface.viewers.StyledString.Styler; |
| import org.eclipse.jface.viewers.ViewerCell; |
| import org.eclipse.swt.graphics.Image; |
| |
| import org.eclipse.statet.jcommons.collections.IntIntervalArrays; |
| import org.eclipse.statet.jcommons.collections.IntList; |
| import org.eclipse.statet.jcommons.lang.Nullable; |
| |
| import org.eclipse.statet.ecommons.debug.ui.ECommonsDebugUIResources; |
| import org.eclipse.statet.ecommons.models.core.util.ElementPartition; |
| |
| import org.eclipse.statet.base.ui.StatetImages; |
| import org.eclipse.statet.ltk.core.ElementName; |
| import org.eclipse.statet.ltk.core.LTKUtils; |
| import org.eclipse.statet.ltk.model.core.elements.IModelElement; |
| import org.eclipse.statet.ltk.ui.ElementLabelProvider; |
| import org.eclipse.statet.r.core.data.CombinedRElement; |
| import org.eclipse.statet.r.core.data.CombinedRList; |
| import org.eclipse.statet.r.core.model.ArgsDefinition; |
| import org.eclipse.statet.r.core.model.ArgsDefinition.Arg; |
| import org.eclipse.statet.r.core.model.IRClass; |
| import org.eclipse.statet.r.core.model.IRClassExtension; |
| import org.eclipse.statet.r.core.model.IRElement; |
| import org.eclipse.statet.r.core.model.IRFrame; |
| import org.eclipse.statet.r.core.model.IRMethod; |
| import org.eclipse.statet.r.core.model.IRSlot; |
| import org.eclipse.statet.r.core.model.IRSourceUnit; |
| import org.eclipse.statet.r.core.model.RElementName; |
| import org.eclipse.statet.rj.data.RArray; |
| import org.eclipse.statet.rj.data.RDataFrame; |
| import org.eclipse.statet.rj.data.RDataUtils; |
| import org.eclipse.statet.rj.data.REnvironment; |
| import org.eclipse.statet.rj.data.RFactorStore; |
| import org.eclipse.statet.rj.data.RIntegerStore; |
| import org.eclipse.statet.rj.data.RList; |
| import org.eclipse.statet.rj.data.RObject; |
| import org.eclipse.statet.rj.data.RReference; |
| import org.eclipse.statet.rj.data.RStore; |
| |
| |
| /** |
| * Label Provider for R elements |
| */ |
| public class RLabelProvider extends StyledCellLabelProvider |
| implements ElementLabelProvider, ILabelProvider { |
| |
| |
| public static final int NAMESPACE= 0x001; |
| public static final int HEADER= 0x002; |
| public static final int LONG= 0x004; |
| public static final int COUNT= 0x008; |
| public static final int ASSIST= 0x010; |
| public static final int NO_STORE_TYPE= 0x020; |
| public static final int RESOURCE_PATH= 0x100; |
| |
| |
| private final StringBuilder textBuilder= new StringBuilder(100); |
| private final Styler defaultStyler; |
| |
| private int style; |
| |
| |
| public RLabelProvider() { |
| this(0); |
| } |
| |
| public RLabelProvider(final int style) { |
| if ((this.style & LONG) != 0) { |
| this.style |= COUNT; |
| } |
| this.style= style; |
| if ((this.style & HEADER) != 0) { |
| this.defaultStyler= ElementLabelProvider.TITLE_STYLER; |
| } |
| else { |
| this.defaultStyler= null; |
| } |
| } |
| |
| |
| protected final StringBuilder getTextBuilder() { |
| this.textBuilder.setLength(0); |
| return this.textBuilder; |
| } |
| |
| |
| @Override |
| public Image getImage(final IModelElement element) { |
| switch ((element.getElementType() & MASK_C1) >> SHIFT_C1) { |
| |
| case (IModelElement.C1_SOURCE >> SHIFT_C1): |
| return RUI.getImage(RUI.IMG_OBJ_R_SCRIPT); |
| |
| case (IModelElement.C1_IMPORT >> SHIFT_C1): |
| return StatetImages.getImage(StatetImages.OBJ_IMPORT); |
| |
| case (IModelElement.C1_METHOD >> SHIFT_C1): |
| switch (element.getElementType() & MASK_C2) { |
| case IRElement.R_GENERIC_FUNCTION: |
| return RUI.getImage(RUI.IMG_OBJ_GENERIC_FUNCTION); |
| case IRElement.R_S4METHOD: |
| return RUI.getImage(RUI.IMG_OBJ_METHOD); |
| // case IRLangElement.R_COMMON_FUNCTION: |
| default: |
| return RUI.getImage( ((element.getElementType() & 0xf) != 0x1) ? |
| RUI.IMG_OBJ_COMMON_FUNCTION : RUI.IMG_OBJ_COMMON_LOCAL_FUNCTION); |
| } |
| case (IModelElement.C1_CLASS >> SHIFT_C1): |
| switch (element.getElementType() & MASK_C2) { |
| case IRElement.R_S4CLASS: |
| return StatetImages.getImage(StatetImages.OBJ_CLASS); |
| case IRElement.R_S4CLASS_EXTENSION: |
| return StatetImages.getImage(StatetImages.OBJ_CLASS_EXT); |
| default: |
| return null; |
| } |
| |
| case (IModelElement.C1_VARIABLE >> SHIFT_C1): |
| if (element instanceof CombinedRElement) { |
| return getImage((CombinedRElement) element); |
| } |
| switch (element.getElementType() & MASK_C2) { |
| case IRElement.R_S4SLOT: |
| return RUI.getImage(RUI.IMG_OBJ_SLOT); |
| // case IRLangElement.R_COMMON_VARIABLE: |
| default: |
| return RUI.getImage( ((element.getElementType() & 0xf) != 0x1) ? |
| RUI.IMG_OBJ_GENERAL_VARIABLE : RUI.IMG_OBJ_GENERAL_LOCAL_VARIABLE); |
| } |
| |
| default: |
| return null; |
| } |
| } |
| |
| private Image getImage(final CombinedRElement element) { |
| int rObjectType; |
| RObject rObject; |
| if (element.getRObjectType() == RObject.TYPE_REFERENCE) { |
| final RReference ref= (RReference) element; |
| rObjectType= ref.getReferencedRObjectType(); |
| rObject= ref.getResolvedRObject(); |
| if (rObjectType == 0) { |
| rObjectType= (rObject != null) ? rObject.getRObjectType() : RObject.TYPE_REFERENCE; |
| } |
| } |
| else { |
| rObjectType= element.getRObjectType(); |
| rObject= element; |
| } |
| |
| switch (rObjectType) { |
| case RObject.TYPE_NULL: |
| return RUI.getImage(RUI.IMG_OBJ_NULL); |
| case RObject.TYPE_FUNCTION: |
| throw new IllegalArgumentException(); |
| case RObject.TYPE_LIST: |
| return RUI.getImage(RUI.IMG_OBJ_LIST); |
| case RObject.TYPE_DATAFRAME: |
| return RUI.getImage(RUI.IMG_OBJ_DATAFRAME); |
| case RObject.TYPE_VECTOR: |
| return (element.getModelParent() != null && element.getModelParent().getRObjectType() == RObject.TYPE_DATAFRAME) ? |
| RUI.getImage(RUI.IMG_OBJ_DATAFRAME_COLUMN) : RUI.getImage(RUI.IMG_OBJ_VECTOR); |
| case RObject.TYPE_ARRAY: |
| return RUI.getImage(RUI.IMG_OBJ_ARRAY); |
| case RObject.TYPE_S4OBJECT: |
| if (element.getData() != null) { |
| return (element.getModelParent() != null && element.getModelParent().getRObjectType() == RObject.TYPE_DATAFRAME) ? |
| RUI.getImage(RUI.IMG_OBJ_S4OBJ_DATAFRAME_COLUMN) : RUI.getImage(RUI.IMG_OBJ_S4OBJ_VECTOR); |
| } |
| return RUI.getImage(RUI.IMG_OBJ_S4OBJ); |
| case RObject.TYPE_ENVIRONMENT: |
| if (rObject instanceof REnvironment) { |
| final REnvironment renv= (REnvironment) element; |
| switch (renv.getSpecialType()) { |
| case REnvironment.ENVTYPE_GLOBAL: |
| return RUI.getImage(RUI.IMG_OBJ_GLOBALENV); |
| case REnvironment.ENVTYPE_BASE: |
| case REnvironment.ENVTYPE_PACKAGE: |
| return RUI.getImage(RUI.IMG_OBJ_PACKAGEENV); |
| case REnvironment.ENVTYPE_EMTPY: |
| return RUI.getImage(RUI.IMG_OBJ_EMPTYENV); |
| } |
| } |
| return RUI.getImage(RUI.IMG_OBJ_OTHERENV); |
| case RObject.TYPE_MISSING: |
| return RUI.getImage(RUI.IMG_OBJ_MISSING); |
| case RObject.TYPE_PROMISE: |
| return RUI.getImage(RUI.IMG_OBJ_PROMISE); |
| case RObject.TYPE_REFERENCE: |
| default: |
| return RUI.getImage(RUI.IMG_OBJ_GENERAL_VARIABLE); |
| } |
| } |
| |
| |
| @Override |
| public String getText(final IModelElement element) { |
| final String name= element.getElementName().getDisplayName(); |
| |
| final StringBuilder text; |
| switch ((element.getElementType() & MASK_C1) >> SHIFT_C1) { |
| |
| case (IModelElement.C1_METHOD >> SHIFT_C1): |
| text= (name != null) ? new StringBuilder(name) : new StringBuilder(); |
| appendMethodDetail(text, (IRMethod) element); |
| return text.toString(); |
| |
| case (IModelElement.C1_CLASS >> SHIFT_C1): |
| switch (element.getElementType() & MASK_C2) { |
| case IRElement.R_S4CLASS_EXTENSION: |
| text= (name != null) ? new StringBuilder(name) : new StringBuilder(); |
| appendClassExtDetail(text, (IRClassExtension) element); |
| return text.toString(); |
| } |
| break; |
| case (IModelElement.C1_VARIABLE >> SHIFT_C1): |
| switch (element.getElementType() & MASK_C2) { |
| case IRElement.R_S4SLOT: |
| text= (name != null) ? new StringBuilder(name) : new StringBuilder(); |
| appendSlotDetail(text, (IRSlot) element); |
| return text.toString(); |
| } |
| break; |
| } |
| return name; |
| } |
| |
| // public void decorateText(final StringBuilder text, final IModelElement element) { |
| // switch (element.getElementType() & IModelElement.MASK_C1) { |
| // |
| // case IModelElement.C1_METHOD: |
| // appendMethodDetail(text, (IRMethod) element); |
| // return; |
| // |
| // case IModelElement.C1_CLASS: |
| // switch (element.getElementType() & IModelElement.MASK_C2) { |
| // case IRLangElement.R_S4CLASS_EXTENSION: |
| // appendClassExtDetail(text, (IRClassExtension) element); |
| // return; |
| // } |
| // |
| // case IModelElement.C1_VARIABLE: |
| // switch (element.getElementType() & IModelElement.MASK_C2) { |
| // case IRLangElement.R_S4SLOT: |
| // appendSlotDetail(text, (IRSlot) element); |
| // return; |
| // } |
| // |
| // } |
| // } |
| |
| @Override |
| public StyledString getStyledText(final IModelElement element) { |
| if (element instanceof IRElement) { |
| final IRElement rElement= (IRElement) element; |
| return getStyledText(rElement, rElement.getElementName(), null); |
| } |
| else if (element instanceof IRSourceUnit) { |
| return getStyledText((IRSourceUnit) element); |
| } |
| else { |
| final ElementName elementName= element.getElementName(); |
| return new StyledString(elementName.getDisplayName(), this.defaultStyler); |
| } |
| } |
| |
| @Override |
| public int @Nullable [] getStyledTextRegions(final IModelElement element, |
| final int flags, final int[] regions) { |
| if (element instanceof IRElement) { |
| final IRElement rElement= (IRElement) element; |
| return getStyledTextRegions(rElement, rElement.getElementName(), |
| flags, regions ); |
| } |
| else if (element instanceof IRSourceUnit) { |
| return getStyledTextRegions((IRSourceUnit) element, |
| flags, regions ); |
| } |
| else if (flags == 0) { |
| final ElementName elementName= element.getElementName(); |
| if (elementName.getDisplayName().startsWith(elementName.getSegmentName())) { |
| return regions; |
| } |
| } |
| return null; |
| } |
| |
| public StyledString getStyledText(final IRElement element, final RElementName elementName, final RList elementAttr) { |
| final RElementName elementName0= (elementName != null) ? elementName : element.getElementName(); |
| final StyledString text= new StyledString(); |
| final String name; |
| |
| switch ((element.getElementType() & MASK_C1) >> SHIFT_C1) { |
| |
| case (IModelElement.C1_METHOD >> SHIFT_C1): |
| if (this.style != 0 && elementName0.getNextSegment() == null) { |
| final String segmentName= elementName0.getSegmentName(); |
| int length; |
| if (segmentName != null && ((length= segmentName.length()) > 2) |
| && segmentName.charAt(length - 2) == '<' |
| && segmentName.charAt(length - 1) == '-' ) { |
| text.append(RElementName.create(RElementName.MAIN_DEFAULT, segmentName.substring(0, length-2)).getDisplayName(), this.defaultStyler); |
| appendMethodDetailAssignmentSpecial(text, (IRMethod) element); |
| text.append(" <- value"); //$NON-NLS-1$ |
| break; |
| } |
| } |
| name= elementName0.getDisplayName(); |
| if (name != null) { |
| text.append(name, this.defaultStyler); |
| } |
| appendMethodDetail(text, (IRMethod) element); |
| break; |
| |
| case (IModelElement.C1_CLASS >> SHIFT_C1): |
| name= elementName0.getDisplayName(); |
| if (name != null) { |
| text.append(name, this.defaultStyler); |
| } |
| switch (element.getElementType() & MASK_C2) { |
| case IRElement.R_S4CLASS_EXTENSION: |
| appendClassExtDetail(text, (IRClassExtension) element); |
| } |
| break; |
| |
| case (IModelElement.C1_VARIABLE >> SHIFT_C1): |
| if (element instanceof CombinedRElement) { |
| final CombinedRElement cElement= (CombinedRElement) element; |
| if (cElement.getRObjectType() == RObject.TYPE_ENVIRONMENT && elementName == null) { |
| text.append(elementName0.getSegmentName(), this.defaultStyler); |
| } |
| else { |
| name= elementName0.getDisplayName(); |
| if (name != null) { |
| text.append(name, this.defaultStyler); |
| } |
| } |
| decorateStyledText(text, cElement, elementName0, elementAttr); |
| break; |
| } |
| name= elementName0.getDisplayName(); |
| if (name != null) { |
| text.append(name, this.defaultStyler); |
| } |
| switch (element.getElementType() & MASK_C2) { |
| case IRElement.R_S4SLOT: |
| appendSlotDetail(text, (IRSlot) element); |
| } |
| break; |
| |
| default: |
| name= elementName0.getDisplayName(); |
| if (name != null) { |
| text.append(name, this.defaultStyler); |
| } |
| break; |
| |
| } |
| |
| if ((this.style & NAMESPACE) != 0) { |
| ElementName scope= elementName0.getScope(); |
| if (scope == null) { |
| final IModelElement parent= element.getModelParent(); |
| if (parent != null) { |
| final IRFrame frame= parent.getAdapter(IRFrame.class); |
| if (frame != null) { |
| scope= frame.getElementName(); |
| } |
| } |
| } |
| if (scope != null) { |
| final StringBuilder textBuilder= getTextBuilder(); |
| textBuilder.append(" - "); //$NON-NLS-1$ |
| textBuilder.append(scope.getDisplayName()); |
| text.append(textBuilder.toString(), StyledString.QUALIFIER_STYLER); |
| } |
| } |
| return text; |
| } |
| |
| public int[] getStyledTextRegions(final IRElement element, final RElementName elementName, |
| final int flags, int[] regions) { |
| final RElementName elementName0= (elementName != null) ? elementName : element.getElementName(); |
| |
| switch ((element.getElementType() & MASK_C1) >> SHIFT_C1) { |
| |
| case (IModelElement.C1_METHOD >> SHIFT_C1): |
| if (this.style != 0 && elementName0.getNextSegment() == null) { |
| final String segmentName= elementName0.getSegmentName(); |
| int length; |
| if (segmentName != null && ((length= segmentName.length()) > 2) |
| && segmentName.charAt(length - 2) == '<' |
| && segmentName.charAt(length - 1) == '-' ) { |
| regions= IntIntervalArrays.removeTail(regions, length - 2); |
| regions= RElementName.create(RElementName.MAIN_DEFAULT, segmentName.substring(0, length-2)) |
| .correctDisplayNameRegions(regions, 0); |
| break; |
| } |
| } |
| regions= elementName0.correctDisplayNameRegions(regions, 0); |
| break; |
| |
| default: |
| regions= elementName0.correctDisplayNameRegions(regions, 0); |
| break; |
| |
| } |
| |
| return regions; |
| } |
| |
| private StyledString decorateStyledText(final StyledString text, final CombinedRElement element, final ElementName elementName, final RList elementAttr) { |
| switch (element.getRObjectType()) { |
| case RObject.TYPE_NULL: |
| break; |
| case RObject.TYPE_FUNCTION: |
| throw new IllegalArgumentException(); |
| case RObject.TYPE_VECTOR: |
| appendVectorDetail(text, element, elementAttr); |
| break; |
| case RObject.TYPE_ARRAY: |
| appendArrayDetail(text, element, elementAttr); |
| break; |
| case RObject.TYPE_DATAFRAME: |
| appendDataframeDetail(text, element, elementAttr); |
| break; |
| case RObject.TYPE_LIST: |
| appendListDetail(text, element, elementAttr); |
| break; |
| case RObject.TYPE_ENVIRONMENT: |
| appendEnvDetail(text, element, elementAttr); |
| break; |
| case RObject.TYPE_S4OBJECT: |
| appendS4ObjectDetail(text, element, elementAttr); |
| break; |
| |
| case RObject.TYPE_REFERENCE: |
| default: |
| if ((this.style & LONG) != 0) { |
| appendLongClassInfo(text, element, elementAttr); |
| } |
| else { |
| final StringBuilder textBuilder= getTextBuilder(); |
| textBuilder.append(" : "); //$NON-NLS-1$ |
| textBuilder.append(element.getRClassName()); |
| text.append(textBuilder.toString(), StyledString.DECORATIONS_STYLER); |
| } |
| break; |
| } |
| |
| return text; |
| } |
| |
| // public void decorateStyledText(final StyledString text, final IModelElement element) { |
| // decorateStyledText(text, element, null); |
| // } |
| // |
| // public void decorateStyledText(final StyledString text, final IModelElement element, final RList elementAttr) { |
| // switch (element.getElementType() & IModelElement.MASK_C1) { |
| // |
| // case IModelElement.C1_METHOD: |
| // appendMethodDetail(text, (IRMethod) element); |
| // break; |
| // |
| // case IModelElement.C1_CLASS: |
| // switch (element.getElementType() & IModelElement.MASK_C2) { |
| // case IRLangElement.R_S4CLASS_EXTENSION: |
| // appendClassExtDetail(text, (IRClassExtension) element); |
| // break; |
| // } |
| // |
| // case IModelElement.C1_VARIABLE: |
| // switch (element.getElementType() & IModelElement.MASK_C2) { |
| // case IRLangElement.R_S4SLOT: |
| // appendSlotDetail(text, (IRSlot) element); |
| // break; |
| // } |
| // |
| // } |
| // } |
| |
| public StyledString getStyledText(final IRSourceUnit sourceUnit) { |
| final ElementName elementName= sourceUnit.getElementName(); |
| final StyledString text= new StyledString(elementName.getDisplayName(), this.defaultStyler); |
| if ((this.style & RESOURCE_PATH) != 0) { |
| final Object resource= sourceUnit.getResource(); |
| if (resource instanceof IResource) { |
| appendPath(text, ((IResource) resource).getParent()); |
| } |
| } |
| return text; |
| } |
| |
| public int[] getStyledTextRegions(final IRSourceUnit sourceUnit, |
| final int flags, final int[] regions) { |
| return regions; |
| } |
| |
| public String getText(final ElementPartition partition) { |
| final StringBuilder text= new StringBuilder(); |
| text.append("["); //$NON-NLS-1$ |
| text.append(Long.toString((partition.getPartitionStart() + 1))); |
| text.append(" ... "); //$NON-NLS-1$ |
| text.append(Long.toString(partition.getPartitionStart() + partition.getPartitionLength())); |
| text.append("]"); //$NON-NLS-1$ |
| return text.toString(); |
| } |
| |
| |
| @Override |
| public Image getImage(final Object element) { |
| final IModelElement modelElement= LTKUtils.getModelElement(element); |
| if (modelElement != null) { |
| if (modelElement instanceof CombinedRElement) { |
| return getImage((CombinedRElement) modelElement); |
| } |
| return getImage(modelElement); |
| } |
| return null; |
| } |
| |
| @Override |
| public String getText(final Object element) { |
| if (element instanceof ElementPartition) { |
| return getText((ElementPartition) element); |
| } |
| final IModelElement modelElement= LTKUtils.getModelElement(element); |
| if (modelElement != null) { |
| // if (modelElement instanceof ICombinedRElement) { |
| // return getText((ICombinedRElement) modelElement); |
| // } |
| return getText(modelElement); |
| } |
| return null; |
| } |
| |
| @Override |
| public void update(final ViewerCell cell) { |
| final Object element= cell.getElement(); |
| final IModelElement modelElement= LTKUtils.getModelElement(element); |
| if (element instanceof ElementPartition) { |
| update(cell, (ElementPartition) element, modelElement); |
| super.update(cell); |
| } |
| else if (modelElement != null) { |
| update(cell, modelElement); |
| super.update(cell); |
| } |
| else { |
| cell.setImage(null); |
| cell.setText(element.toString()); |
| cell.setStyleRanges(null); |
| super.update(cell); |
| } |
| } |
| |
| public void update(final ViewerCell cell, final IModelElement element) { |
| Image image= null; |
| StyledString styledText= null; |
| |
| if (element instanceof CombinedRElement) { |
| final CombinedRElement combined= (CombinedRElement) element; |
| if (combined.getRObjectType() == RObject.TYPE_REFERENCE) { |
| final RObject realObject= ((RReference) element).getResolvedRObject(); |
| if (realObject instanceof CombinedRElement) { |
| image= getImage((CombinedRElement) realObject); |
| styledText= getStyledText((CombinedRElement) realObject, combined.getElementName(), null); |
| } |
| } |
| } |
| |
| if (image == null) { |
| image= getImage(element); |
| } |
| cell.setImage(image); |
| |
| if (styledText == null) { |
| styledText= getStyledText(element); |
| } |
| if (styledText != null) { |
| cell.setText(styledText.getString()); |
| cell.setStyleRanges(styledText.getStyleRanges()); |
| } |
| else { |
| cell.setText(getText(element)); |
| cell.setStyleRanges(null); |
| } |
| } |
| |
| public void update(final ViewerCell cell, final ElementPartition partition, final IModelElement element) { |
| cell.setImage(ECommonsDebugUIResources.INSTANCE.getImage( |
| ECommonsDebugUIResources.OBJ_VARIABLE_PARTITION )); |
| |
| final StyledString text= new StyledString(); |
| text.append("["); //$NON-NLS-1$ |
| text.append(Long.toString((partition.getPartitionStart() + 1))); |
| text.append(" ... "); //$NON-NLS-1$ |
| text.append(Long.toString(partition.getPartitionStart() + partition.getPartitionLength())); |
| text.append("]"); //$NON-NLS-1$ |
| |
| if (element instanceof RList) { |
| final RList rList= (RList) element; |
| String label= rList.getName(partition.getPartitionStart()); |
| if (label != null) { |
| text.append(" "); //$NON-NLS-1$ |
| text.append(label, StyledString.QUALIFIER_STYLER); |
| text.append(" ... ", StyledString.QUALIFIER_STYLER); //$NON-NLS-1$ |
| label= rList.getName(partition.getPartitionStart() + (partition.getPartitionLength() - 1)); |
| if (label != null) { |
| text.append(label, StyledString.QUALIFIER_STYLER); |
| } |
| } |
| } |
| |
| cell.setText(text.getString()); |
| cell.setStyleRanges(text.getStyleRanges()); |
| } |
| |
| @Override |
| public String getToolTipText(final Object element) { |
| final StringBuilder text; |
| |
| final IModelElement modelElement= LTKUtils.getModelElement(element); |
| if (modelElement != null) { |
| switch ((modelElement.getElementType() & MASK_C1) >> SHIFT_C1) { |
| |
| case (IModelElement.C1_METHOD >> SHIFT_C1): { |
| text= new StringBuilder(); |
| appendMethodMLText(text, (IRMethod) modelElement); |
| return text.toString(); } |
| |
| case (IModelElement.C1_CLASS >> SHIFT_C1): |
| switch (modelElement.getElementType() & MASK_C2) { |
| case IRElement.R_S4CLASS: |
| text= new StringBuilder(); |
| appendClassMLText(text, (IRClass) modelElement); |
| return text.toString(); |
| case IRElement.R_S4CLASS_EXTENSION: |
| text= new StringBuilder(); |
| appendClassExtMLText(text, (IRClassExtension) modelElement); |
| return text.toString(); |
| default: |
| return null; |
| } |
| } |
| } |
| return null; |
| } |
| |
| protected void appendMethodDetail(final StringBuilder text, final IRMethod method) { |
| final ArgsDefinition args= method.getArgsDefinition(); |
| final boolean showTypes= (method.getElementType() == IRElement.R_S4METHOD); |
| text.append('('); |
| if (args == null) { |
| text.append("<unknown>"); |
| } |
| else if (args.size() > 0) { |
| final int last= args.size() - 1; |
| if (showTypes) { |
| for (int i= 0; i < last; i++) { |
| appendArgWithType(text, args.get(i)); |
| text.append(", "); //$NON-NLS-1$ |
| } |
| appendArgWithType(text, args.get(last)); |
| } |
| else { |
| for (int i= 0; i < last; i++) { |
| appendArg(text, args.get(i)); |
| text.append(", "); //$NON-NLS-1$ |
| } |
| appendArg(text, args.get(last)); |
| } |
| } |
| text.append(')'); |
| } |
| |
| public void appendArgumentInformation(final StringBuilder text, final IntList idxs, final ArgsDefinition args) { |
| if (args != null) { |
| if (args.size() == 0) { |
| text.append("<no arguments>"); |
| } |
| else { |
| final int last= args.size() - 1; |
| idxs.add(text.length()); |
| for (int i= 0; i < last; i++) { |
| appendArg(text, args.get(i)); |
| text.append(", "); //$NON-NLS-1$ |
| idxs.add(text.length()-1); |
| } |
| appendArg(text, args.get(last)); |
| } |
| } |
| else { |
| text.append("<unkown>"); |
| } |
| } |
| |
| protected void appendMethodDetail(final StyledString text, final IRMethod method) { |
| final ArgsDefinition args= method.getArgsDefinition(); |
| final boolean showTypes= (method.getElementType() == IRElement.R_S4METHOD); |
| text.append("(", this.defaultStyler); //$NON-NLS-1$ |
| if (args == null) { |
| text.append("<unknown>", this.defaultStyler); |
| } |
| else if (args.size() > 0) { |
| final int last= args.size() - 1; |
| if (showTypes) { |
| for (int i= 0; i < last; i++) { |
| appendArgWithType(text, args.get(i)); |
| text.append(", ", this.defaultStyler); //$NON-NLS-1$ |
| } |
| appendArgWithType(text, args.get(last)); |
| } |
| else { |
| for (int i= 0; i < last; i++) { |
| appendArg(text, args.get(i)); |
| text.append(", ", this.defaultStyler); //$NON-NLS-1$ |
| } |
| appendArg(text, args.get(last)); |
| } |
| } |
| text.append(")", this.defaultStyler); //$NON-NLS-1$ |
| } |
| |
| protected void appendMethodDetailAssignmentSpecial(final StyledString text, final IRMethod method) { |
| final ArgsDefinition args= method.getArgsDefinition(); |
| final boolean showTypes= (method.getElementType() == IRElement.R_S4METHOD); |
| text.append("(", this.defaultStyler); //$NON-NLS-1$ |
| if (args == null) { |
| text.append("<unknown>", this.defaultStyler); |
| } |
| else if (args.size() > 0) { |
| final int last= args.size() - 1; |
| if (showTypes) { |
| for (int i= 0; i < last; i++) { |
| appendArgWithType(text, args.get(i)); |
| text.append(", ", this.defaultStyler); //$NON-NLS-1$ |
| } |
| appendArgWithType(text, args.get(last)); |
| } |
| else { |
| for (int i= 0; i < last; i++) { |
| appendArg(text, args.get(i)); |
| text.append(", ", this.defaultStyler); //$NON-NLS-1$ |
| } |
| appendArg(text, args.get(last)); |
| } |
| } |
| text.append(")", this.defaultStyler); //$NON-NLS-1$ |
| } |
| |
| private void appendArg(final StyledString text, final Arg arg) { |
| if (arg.name != null) { |
| text.append(arg.name, this.defaultStyler); |
| } |
| } |
| |
| private void appendArg(final StringBuilder text, final Arg arg) { |
| if (arg.name != null) { |
| text.append(arg.name); |
| } |
| } |
| |
| private void appendArgWithType(final StyledString text, final Arg arg) { |
| if (arg.name != null) { |
| text.append(arg.name, this.defaultStyler); |
| } |
| if (arg.className != null) { |
| text.append(" : ", StyledString.DECORATIONS_STYLER); //$NON-NLS-1$ |
| text.append(arg.className, StyledString.DECORATIONS_STYLER); |
| } |
| } |
| |
| private void appendArgWithType(final StringBuilder text, final Arg arg) { |
| if (arg.name != null) { |
| text.append(arg.name); |
| } |
| if (arg.className != null) { |
| text.append(" : "); //$NON-NLS-1$ |
| text.append(arg.className); |
| } |
| } |
| |
| protected void appendMethodMLText(final StringBuilder sb, final IRMethod method) { |
| final ArgsDefinition args= method.getArgsDefinition(); |
| final String name= method.getElementName().getDisplayName(); |
| if (name != null) { |
| sb.append(name); |
| } |
| if (args != null && args.size() > 0) { |
| sb.ensureCapacity(sb.length() + 5 + args.size()*20); |
| sb.append("( \n"); //$NON-NLS-1$ |
| final int last= args.size() - 1; |
| sb.append(" "); //$NON-NLS-1$ |
| for (int i= 0; i < last; i++) { |
| appendArgLong(sb, args.get(i)); |
| sb.append(",\n "); //$NON-NLS-1$ |
| } |
| appendArgLong(sb, args.get(last)); |
| sb.append("\n)"); //$NON-NLS-1$ |
| } |
| else { |
| sb.append("()"); //$NON-NLS-1$ |
| } |
| } |
| |
| private void appendArgLong(final StringBuilder sb, final Arg arg) { |
| if (arg.name != null) { |
| sb.append(arg.name); |
| } |
| if (arg.className != null) { |
| sb.append(" : "); //$NON-NLS-1$ |
| sb.append(arg.className); |
| } |
| } |
| |
| protected void appendClassMLText(final StringBuilder sb, final IRClass clazz) { |
| final List<String> extendedClassNames= clazz.getExtendedClassNames(); |
| final String name= clazz.getElementName().getDisplayName(); |
| if (name != null) { |
| sb.append(name); |
| } |
| if (extendedClassNames != null && !extendedClassNames.isEmpty()) { |
| sb.ensureCapacity(sb.length() + 15 + extendedClassNames.size()*16); |
| sb.append("\n extends "); //$NON-NLS-1$ |
| final int last= extendedClassNames.size() - 1; |
| for (int i= 0; i < last; i++) { |
| sb.append(extendedClassNames.get(i)); |
| sb.append(", "); //$NON-NLS-1$ |
| } |
| sb.append(extendedClassNames.get(last)); |
| } |
| } |
| |
| protected void appendClassExtDetail(final StyledString text, final IRClassExtension ext) { |
| final String command= ext.getExtCommand(); |
| if (command != null) { |
| if (command.equals("setIs")) { //$NON-NLS-1$ |
| text.append("\u200A->\u200A"); //$NON-NLS-1$ |
| } |
| else { |
| return; |
| } |
| final String type= ext.getExtTypeName(); |
| if (type != null) { |
| text.append(type); |
| } |
| } |
| } |
| |
| protected void appendClassExtDetail(final StringBuilder sb, final IRClassExtension ext) { |
| final String command= ext.getExtCommand(); |
| if (command != null) { |
| if (command.equals("setIs")) { //$NON-NLS-1$ |
| sb.append("\u200A->\u200A"); //$NON-NLS-1$ |
| } |
| else { |
| return; |
| } |
| final String type= ext.getExtTypeName(); |
| if (type != null) { |
| sb.append(type); |
| } |
| } |
| } |
| |
| protected void appendClassExtMLText(final StringBuilder text, final IRClassExtension ext) { |
| final String name= ext.getElementName().getDisplayName(); |
| if (name != null) { |
| text.append(name); |
| } |
| final String command= ext.getExtCommand(); |
| if (command != null) { |
| text.append("\n "); //$NON-NLS-1$ |
| text.append(command); |
| final String type= ext.getExtTypeName(); |
| if (type != null) { |
| text.append(' '); |
| text.append(type); |
| } |
| text.append(' '); |
| } |
| } |
| |
| protected void appendSlotDetail(final StyledString text, final IRSlot slot) { |
| final String type= slot.getTypeName(); |
| if (type != null) { |
| text.append(" : ", StyledString.DECORATIONS_STYLER); //$NON-NLS-1$ |
| text.append(type, StyledString.DECORATIONS_STYLER); |
| } |
| } |
| |
| protected void appendSlotDetail(final StringBuilder text, final IRSlot slot) { |
| } |
| |
| |
| protected void appendLongClassInfo(final StyledString text, final CombinedRElement element, final RList elementAttr) { |
| final StringBuilder textBuilder= getTextBuilder(); |
| textBuilder.append(" : "); //$NON-NLS-1$ |
| RStore classData= null; |
| if (elementAttr != null) { |
| final RObject object= elementAttr.get("class"); //$NON-NLS-1$ |
| if (object != null && object.getRObjectType() == RObject.TYPE_VECTOR && object.getData().getStoreType() == RStore.CHARACTER) { |
| classData= object.getData(); |
| if (classData.getLength() > 0) { |
| final int last= (int) classData.getLength() - 1; |
| for (int i= 0; i < last; i++) { |
| if (!classData.isNA(i)) { |
| textBuilder.append(classData.getChar(i)); |
| textBuilder.append(", "); //$NON-NLS-1$ |
| } |
| } |
| textBuilder.append(classData.getChar(last)); |
| } |
| } |
| } |
| if (textBuilder.length() == 3) { |
| textBuilder.append(element.getRClassName()); |
| } |
| if (element.getData() != null && element.getData().getStoreType() > 0 |
| && !((classData != null) ? |
| classData.contains(RDataUtils.getStoreClass(element.getData())) : |
| element.getRClassName().equals(RDataUtils.getStoreClass(element.getData())) )) { |
| textBuilder.append(" ("); //$NON-NLS-1$ |
| textBuilder.append(RDataUtils.getStoreAbbr(element.getData())); |
| textBuilder.append(')'); |
| } |
| text.append(textBuilder.toString(), StyledString.DECORATIONS_STYLER); |
| } |
| |
| protected void appendVectorDetail(final StyledString text, final CombinedRElement element, final RList elementAttr) { |
| final byte datatype= element.getData().getStoreType(); |
| final StringBuilder sb; |
| if ((this.style & LONG) != 0) { |
| appendLongClassInfo(text, element, elementAttr); |
| sb= getTextBuilder(); |
| } |
| else { |
| sb= getTextBuilder(); |
| sb.append(" : "); //$NON-NLS-1$ |
| if (element.getRClassName().equals(element.getData().getBaseVectorRClassName())) { |
| if ((this.style & NO_STORE_TYPE) == 0) { |
| sb.append(RDataUtils.getStoreAbbr(element.getData())); |
| } |
| } |
| else { |
| sb.append(element.getRClassName()); |
| if ((this.style & NO_STORE_TYPE) == 0) { |
| sb.append(" ("); //$NON-NLS-1$ |
| sb.append(RDataUtils.getStoreAbbr(element.getData())); |
| sb.append(')'); |
| } |
| } |
| } |
| sb.append(" ["); //$NON-NLS-1$ |
| sb.append(element.getLength()); |
| sb.append(']'); |
| if ((this.style & NO_STORE_TYPE) == 0 && datatype == RStore.FACTOR) { |
| sb.append(" ("); //$NON-NLS-1$ |
| sb.append(((RFactorStore) element.getData()).getLevelCount()); |
| sb.append(' '); |
| sb.append("levels"); |
| sb.append(')'); |
| } |
| text.append(sb.toString(), StyledString.DECORATIONS_STYLER); |
| } |
| |
| protected void appendArrayDetail(final StyledString text, final CombinedRElement element, final RList elementAttr) { |
| final StringBuilder sb; |
| if ((this.style & LONG) != 0) { |
| appendLongClassInfo(text, element, elementAttr); |
| sb= getTextBuilder(); |
| } |
| else { |
| sb= getTextBuilder(); |
| sb.append(" : "); //$NON-NLS-1$ |
| if (element.getRClassName().equals(RObject.CLASSNAME_ARRAY) |
| || element.getRClassName().equals(RObject.CLASSNAME_MATRIX)) { |
| if ((this.style & NO_STORE_TYPE) == 0) { |
| sb.append(RDataUtils.getStoreAbbr(element.getData())); |
| } |
| } |
| else { |
| sb.append(element.getRClassName()); |
| if ((this.style & NO_STORE_TYPE) == 0) { |
| sb.append(" ("); //$NON-NLS-1$ |
| sb.append(RDataUtils.getStoreAbbr(element.getData())); |
| sb.append(')'); |
| } |
| } |
| } |
| sb.append(" ["); //$NON-NLS-1$ |
| final RIntegerStore dim= ((RArray<?>) element).getDim(); |
| final int dimLength= (int) dim.getLength(); |
| if (dimLength > 0) { |
| sb.append(dim.getInt(0)); |
| for (int i= 1; i < dimLength; i++) { |
| sb.append('×'); |
| sb.append(dim.getInt(i)); |
| } |
| } |
| sb.append(']'); |
| text.append(sb.toString(), StyledString.DECORATIONS_STYLER); |
| } |
| |
| protected void appendListDetail(final StyledString text, final CombinedRElement element, final RList elementAttr) { |
| if ((this.style & COUNT) != 0) { // count info |
| final StringBuilder sb= getTextBuilder(); |
| sb.append(" ("); //$NON-NLS-1$ |
| sb.append(element.getLength()); |
| sb.append(' '); |
| sb.append("items"); |
| sb.append(')'); |
| text.append(sb.toString(), StyledString.COUNTER_STYLER); |
| } |
| |
| if ((this.style & LONG) != 0) { |
| appendLongClassInfo(text, element, elementAttr); |
| } |
| else { |
| if (!element.getRClassName().equals(RObject.CLASSNAME_LIST)) { |
| final StringBuilder sb= getTextBuilder(); |
| sb.setLength(0); |
| sb.append(" : "); //$NON-NLS-1$ |
| sb.append(element.getRClassName()); |
| text.append(sb.toString(), StyledString.DECORATIONS_STYLER); |
| } |
| } |
| } |
| |
| protected void appendEnvDetail(final StyledString text, final CombinedRElement element, final RList elementAttr) { |
| final CombinedRList env= (CombinedRList) element; |
| if ((this.style & COUNT) != 0) { // count info |
| final String countInfo= getEnvCountInfo(env); |
| text.append(countInfo, StyledString.COUNTER_STYLER); |
| } |
| |
| if ((this.style & LONG) != 0) { |
| appendLongClassInfo(text, element, elementAttr); |
| } |
| } |
| |
| protected String getEnvCountInfo(final CombinedRList envir) { |
| final StringBuilder textBuilder= getTextBuilder(); |
| textBuilder.append(" ("); //$NON-NLS-1$ |
| textBuilder.append(envir.getLength()); |
| textBuilder.append(')'); |
| return textBuilder.toString(); |
| } |
| |
| protected void appendDataframeDetail(final StyledString text, final CombinedRElement element, final RList elementAttr) { |
| final RDataFrame dataframe= (RDataFrame) element; |
| if ((this.style & COUNT) != 0) { // count info |
| final StringBuilder sb= getTextBuilder(); |
| sb.append(" ("); //$NON-NLS-1$ |
| sb.append(dataframe.getColumnCount()); |
| sb.append(' '); |
| sb.append("var."); |
| sb.append(')'); |
| text.append(sb.toString(), StyledString.COUNTER_STYLER); |
| } |
| |
| final StringBuilder sb; |
| if ((this.style & LONG) != 0) { |
| appendLongClassInfo(text, element, elementAttr); |
| sb= getTextBuilder(); |
| } |
| else { |
| sb= getTextBuilder(); |
| if (!element.getRClassName().equals(RObject.CLASSNAME_DATAFRAME)) { |
| sb.append(" : "); //$NON-NLS-1$ |
| sb.append(dataframe.getRClassName()); |
| } |
| } |
| sb.append(" ["); //$NON-NLS-1$ |
| sb.append(dataframe.getRowCount()); |
| sb.append(']'); |
| text.append(sb.toString(), StyledString.DECORATIONS_STYLER); |
| } |
| |
| protected void appendS4ObjectDetail(final StyledString text, final CombinedRElement element, final RList elementAttr) { |
| if ((this.style & LONG) != 0) { |
| appendLongClassInfo(text, element, elementAttr); |
| } |
| else { |
| final StringBuilder textBuilder= getTextBuilder(); |
| textBuilder.append(" : "); //$NON-NLS-1$ |
| textBuilder.append(element.getRClassName()); |
| text.append(textBuilder.toString(), StyledString.DECORATIONS_STYLER); |
| } |
| } |
| |
| protected void appendPath(final StyledString text, final IResource resource) { |
| if (resource != null) { |
| text.append(" - ", StyledString.QUALIFIER_STYLER); //$NON-NLS-1$ |
| text.append(resource.getFullPath().makeRelative().toString(), StyledString.QUALIFIER_STYLER); |
| } |
| } |
| |
| } |