diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/AnnotationFilter.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/AnnotationFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..05eb433e8e9f6b404e0019f7fb1c142065a4a7bf --- /dev/null +++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/AnnotationFilter.java @@ -0,0 +1,215 @@ +/*--------------------------------------------------------------------------+ +$Id$ +| | +| Copyright 2014 ForTISS GmbH | +| | +| Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 | +| | +| 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 org.fortiss.tooling.base.ui.annotation.view; + +import java.util.Collection; + +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerFilter; +import org.fortiss.tooling.base.model.element.IAnnotatedSpecification; +import org.fortiss.tooling.base.model.element.IModelElement; +import org.fortiss.tooling.base.ui.annotation.AnnotationEntry; +import org.fortiss.tooling.base.ui.annotation.view.GenericAnnotationView.ColumnHandle; +import org.fortiss.tooling.kernel.model.INamedElement; +import org.fortiss.tooling.kernel.model.IProjectRootElement; + +/** + * Row and column filter for the {@link GenericAnnotationView}. Row filtering is realized by + * inheriting {@link ViewerFilter}, whereas for column filtering is supported by + * {@link AnnotationFilter#passesColumnFilter(ColumnHandle)} that is evaluated in + * {@link GenericAnnotationView#update(Collection)}. + */ +class AnnotationFilter extends ViewerFilter { + /** Filter hint text. */ + static final String FILTER_HINT_TEXT = "type filter text"; + + /** Hierarchy filter option: all model elements from any level */ + static final String HIERARCHY_LEVELS_ALL = "Show all levels"; + + /** Hierarchy filter option: all model elements from current level */ + static final String HIERARCHY_LEVELS_CURRENT = "Show current level"; + + /** Hierarchy filter option: currently selected model element and its offspring */ + static final String HIERARCHY_LEVELS_SELECTED_SUBMODEL = "Show selected sub-model"; + + /** Current model element / annotation name filter pattern */ + private String filterPattern; + + /** Flag whether columns / annotation names should be filtered. */ + private boolean filterColumnName; + + /** Flag whether rows / model element names should be filtered */ + private boolean filterRowName; + + /** Currently selected model element (may be {@code null}). */ + private IModelElement currentySelectedModelElement; + + /** + * Flag whether the displayed rows should be restricted to the currently selected model + * element type. + */ + boolean restrictToSelectedModelElementType; + + /** Row filter option based on hierarchy level of model element. */ + private String hierarchyLevelFilter; + + /** Column filter option based on annotation type */ + private Class<? extends IAnnotatedSpecification> annotationTypeFilter; + + /** {@inheritDoc} */ + @Override + public boolean select(Viewer viewer, Object parentElement, Object element) { + if(!(element instanceof AnnotationEntry)) { + return true; + } + + AnnotationEntry annotationEntry = ((AnnotationEntry)element); + if(!(annotationEntry.getModelElement() instanceof INamedElement)) { + return true; + } + + return passesRowFilter(annotationEntry); + } + + /** + * Returns {@code true} if a given {@code input} passes an case-insensitive filter specified + * by {@code filterString}. + */ + private boolean passesNameFilter(String input) { + // Null-filter accepts every input + if(filterPattern == null || filterPattern.equals(FILTER_HINT_TEXT)) { + return true; + } + + // Null-input cannot be accepted by a non-null filter + if(input == null) { + return false; + } + return input.toLowerCase().contains(filterPattern.toLowerCase()); + } + + /** + * Returns {@code true} if given annotation entry matches the currently selected model + * element (or if this particular filter option is turned off). + */ + private boolean passesSelectedElementTypeFilter(AnnotationEntry annotationEntry) { + if(currentySelectedModelElement == null || + currentySelectedModelElement instanceof IProjectRootElement || + hierarchyLevelFilter == null) { + return true; + } + + int currentlySelectedModelElementLevel = + GenericAnnotationView.getModelElementLevel(currentySelectedModelElement); + int modelElementLevel = + GenericAnnotationView.getModelElementLevel(annotationEntry.getModelElement()); + + if(hierarchyLevelFilter.equals(HIERARCHY_LEVELS_CURRENT)) { + if((GenericAnnotationView.getModelElementLevel(annotationEntry.getModelElement()) != currentlySelectedModelElementLevel) || + (currentySelectedModelElement.eContainer() != GenericAnnotationView + .getModelElementAncestor(annotationEntry.getModelElement(), + modelElementLevel - (currentlySelectedModelElementLevel - 1)))) { + return false; + } + } + if(hierarchyLevelFilter.equals(HIERARCHY_LEVELS_SELECTED_SUBMODEL)) { + if(modelElementLevel < currentlySelectedModelElementLevel) { + return false; + } + + if((modelElementLevel > currentlySelectedModelElementLevel) && + ((currentySelectedModelElement != GenericAnnotationView + .getModelElementAncestor(annotationEntry.getModelElement(), + modelElementLevel - currentlySelectedModelElementLevel))) || + (currentySelectedModelElement != GenericAnnotationView.getModelElementAncestor( + annotationEntry.getModelElement(), modelElementLevel - + (currentlySelectedModelElementLevel - 0)))) { + return false; + } + + } + + return !restrictToSelectedModelElementType || + annotationEntry.getModelElement().getClass() + .equals(currentySelectedModelElement.getClass()); + } + + /** Returns true if the given specification passes the current annotation type filter */ + private boolean passesAnnotationTypeFilter(IAnnotatedSpecification spec) { + return annotationTypeFilter == null || spec.getClass().equals(annotationTypeFilter); + } + + /** + * Returns {@code true} if the column represented by the given column is visible in the + * view. + */ + public boolean passesColumnFilter(ColumnHandle columnHandle) { + return (!filterColumnName || passesNameFilter(columnHandle.getColumnName())) && + passesSelectedElementTypeFilter(columnHandle.getEntry()) && + passesAnnotationTypeFilter(columnHandle.getAnnotatedSpecification()); + } + + /** + * Returns {@code true} if the rows represented by {@code annotationEntry} are visible + * in the view. + */ + public boolean passesRowFilter(AnnotationEntry annotationEntry) { + if(!(annotationEntry.getModelElement() instanceof INamedElement)) { + return true; + } + + return (!filterRowName || passesNameFilter(((INamedElement)annotationEntry + .getModelElement()).getName())) && passesSelectedElementTypeFilter(annotationEntry); + } + + /** Sets the model element / annotation name filter pattern. */ + public void setNameFilterPattern(String filterPattern) { + this.filterPattern = filterPattern; + } + + /** Sets the flag whether rows should be filtered by name. */ + public void setFilterRowName(boolean filterRowName) { + this.filterRowName = filterRowName; + } + + /** Sets the flag whether columns should be filtered by name. */ + public void setFilterColumnName(boolean filterColumnName) { + this.filterColumnName = filterColumnName; + } + + /** Sets the flag whether the view should be filtered by the selected model element type. */ + public void setRestrictToSelectedModelElementType(boolean restrictToSelectedModelElementType) { + this.restrictToSelectedModelElementType = restrictToSelectedModelElementType; + } + + /** Sets the model element hierarchy level filter option. */ + public void setHierarchyLevelFilter(String hierarchyLevelFilter) { + this.hierarchyLevelFilter = hierarchyLevelFilter; + } + + /** Sets the annotation type filter option. */ + public void setAnnotationTypeFilter( + Class<? extends IAnnotatedSpecification> annotationTypeFilter) { + this.annotationTypeFilter = annotationTypeFilter; + } + + /** Sets the currently selected model element (may be {@code null}). */ + public void setCurrentySelectedModelElement(IModelElement currentySelectedModelElement) { + this.currentySelectedModelElement = currentySelectedModelElement; + } +} diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/GenericAnnotationView.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/GenericAnnotationView.java index 6c1ae64c45e368f4a3756cb6048ae4fa3388a6ff..10ab1e7a019ccce8b8541213f865760aecd82aae 100644 --- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/GenericAnnotationView.java +++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/GenericAnnotationView.java @@ -31,13 +31,13 @@ import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; -import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.RowLayout; @@ -56,7 +56,6 @@ import org.fortiss.tooling.base.ui.annotation.editingsupport.ElementNameEditingS import org.fortiss.tooling.base.ui.annotation.valueprovider.IAnnotationValueProvider; import org.fortiss.tooling.base.ui.widget.ExtendedCCombo; import org.fortiss.tooling.kernel.model.INamedElement; -import org.fortiss.tooling.kernel.model.IProjectRootElement; /** * <p> @@ -76,21 +75,17 @@ import org.fortiss.tooling.kernel.model.IProjectRootElement; * @ConQAT.Rating YELLOW Hash: D91763408246ECD3578DAD0E37BC4C41 */ public class GenericAnnotationView extends AnnotationViewPartBase { + /** Root composite of {@link GenericAnnotationView}. */ + Composite rootComposite; /** The table viewer */ protected TableViewer tableViewer; - /** - * Character used to separate the annotation name from the instance name for multi-instance - * annotations. - */ - private final static String MULTIINSTANCE_NAME_SEPARATOR = ":"; - /** Row an column filter for annotations */ - AnnotationFilter annotationFilter; + private AnnotationFilter annotationFilter; /** Widget for filter options */ - private AnnotationFilterWidget filterWidget; + private AnnotationFilterWidget annotationFilterWidget; /** * Last set of {@link AnnotationEntry}s used to {@link #update(Collection)} the @@ -105,7 +100,13 @@ public class GenericAnnotationView extends AnnotationViewPartBase { * a column of the {@link GenericAnnotationView}. Used to sort columns (see * {@link #compareTo(ColumnHandle)}). */ - private class ColumnHandle implements Comparable<ColumnHandle> { + class ColumnHandle implements Comparable<ColumnHandle> { + /** + * Character used to separate the annotation name from the instance name for multi-instance + * annotations. + */ + private final static String MULTIINSTANCE_NAME_SEPARATOR = ":"; + /** * {@link AnnotationEntry} from which a particular {@link IAnnotatedSpecification} is to be * displayed in the column represented by this {@link ColumnHandle}. @@ -172,10 +173,32 @@ public class GenericAnnotationView extends AnnotationViewPartBase { return isCreateColumn; } + /** + * Returns the name of a column for a given {@link IAnnotatedSpecification} represented by + * the + * given {@link ColumnHandle}. + */ + protected String getColumnName() { + // Determine column name + String specName = + getEntry().getSpecificationAnnotationName( + getAnnotatedSpecification().getClass()); + + if(getInstanceKey() != null) { + if(!specName.isEmpty()) { + specName += MULTIINSTANCE_NAME_SEPARATOR + " "; + } + specName += getInstanceKey(); + } else if(specName == null || specName.isEmpty()) { + specName = "<Unnamed Annotation>"; + } + return specName; + } + /** {@inheritDoc} */ @Override public int compareTo(ColumnHandle other) { - String columnName = getColumnName(this); + String columnName = getColumnName(); String annotationName; int columnNameSeparatorIndex = columnName.indexOf(MULTIINSTANCE_NAME_SEPARATOR); @@ -185,7 +208,7 @@ public class GenericAnnotationView extends AnnotationViewPartBase { annotationName = columnName; } - String otherColumnName = getColumnName(other); + String otherColumnName = other.getColumnName(); String otherAnnotationName; int otherColumnNameSeparatorIndex = otherColumnName.indexOf(MULTIINSTANCE_NAME_SEPARATOR); @@ -285,183 +308,6 @@ public class GenericAnnotationView extends AnnotationViewPartBase { } } - /** - * Row and column filter for the {@link GenericAnnotationView}. Row filtering is realized by - * inheriting {@link ViewerFilter}, whereas for column filtering is supported by - * {@link AnnotationFilter#passesColumnFilter(ColumnHandle)} that is evaluated in - * {@link GenericAnnotationView#update(Collection)}. - */ - private class AnnotationFilter extends ViewerFilter { - /** Filter hint text. */ - private static final String FILTER_HINT_TEXT = "type filter text"; - - /** Hierarchy filter option: all model elements from any level */ - private static final String HIERARCHY_LEVELS_ALL = "Show all levels"; - - /** Hierarchy filter option: all model elements from current level */ - private static final String HIERARCHY_LEVELS_CURRENT = "Show current level"; - - /** Hierarchy filter option: currently selected model element and its offspring */ - private static final String HIERARCHY_LEVELS_SELECTED_SUBMODEL = "Show selected sub-model"; - - /** Current model element / annotation name filter pattern */ - private String filterPattern; - - /** Flag whether columns / annotation names should be filtered. */ - private boolean filterColumnName; - - /** Flag whether rows / model element names should be filtered */ - private boolean filterRowName; - - /** - * Flag whether the displayed rows should be restricted to the currently selected model - * element type. - */ - boolean restrictToSelectedModelElementType; - - /** Row filter option based on hierarchy level of model element. */ - private String hierarchyLevelFilter; - - /** Column filter option based on annotation type */ - private Class<? extends IAnnotatedSpecification> annotationTypeFilter; - - /** {@inheritDoc} */ - @Override - public boolean select(Viewer viewer, Object parentElement, Object element) { - if(!(element instanceof AnnotationEntry)) { - return true; - } - - AnnotationEntry annotationEntry = ((AnnotationEntry)element); - if(!(annotationEntry.getModelElement() instanceof INamedElement)) { - return true; - } - - return passesRowFilter(annotationEntry); - } - - /** - * Returns {@code true} if a given {@code input} passes an case-insensitive filter specified - * by {@code filterString}. - */ - private boolean passesNameFilter(String input) { - // Null-filter accepts every input - if(filterPattern == null || filterPattern.equals(FILTER_HINT_TEXT)) { - return true; - } - - // Null-input cannot be accepted by a non-null filter - if(input == null) { - return false; - } - return input.toLowerCase().contains(filterPattern.toLowerCase()); - } - - /** - * Returns {@code true} if given annotation entry matches the currently selected model - * element (or if this particular filter option is turned off). - */ - private boolean passesSelectedElementTypeFilter(AnnotationEntry annotationEntry) { - if(getCurrentlySelectedObject() == null || - getCurrentlySelectedObject() instanceof IProjectRootElement) { - return true; - } - - int currentlySelectedObjectLevel = getModelElementLevel(getCurrentlySelectedObject()); - int modelElementLevel = getModelElementLevel(annotationEntry.getModelElement()); - - if(hierarchyLevelFilter.equals(HIERARCHY_LEVELS_CURRENT)) { - if((getModelElementLevel(annotationEntry.getModelElement()) != currentlySelectedObjectLevel) || - (getCurrentlySelectedObject().eContainer() != getModelElementAncestor( - annotationEntry.getModelElement(), modelElementLevel - - (currentlySelectedObjectLevel - 1)))) { - return false; - } - } - if(hierarchyLevelFilter.equals(HIERARCHY_LEVELS_SELECTED_SUBMODEL)) { - if(modelElementLevel < currentlySelectedObjectLevel) { - return false; - } - - if((modelElementLevel > currentlySelectedObjectLevel) && - ((getCurrentlySelectedObject() != getModelElementAncestor( - annotationEntry.getModelElement(), modelElementLevel - - currentlySelectedObjectLevel))) || - (getCurrentlySelectedObject() != getModelElementAncestor( - annotationEntry.getModelElement(), modelElementLevel - - (currentlySelectedObjectLevel - 0)))) { - return false; - } - - } - - return !restrictToSelectedModelElementType || - annotationEntry.getModelElement().getClass() - .equals(getCurrentlySelectedObject().getClass()); - } - - /** Returns true if the given specification passes the current annotation type filter */ - private boolean passesAnnotationTypeFilter(IAnnotatedSpecification spec) { - return annotationTypeFilter == null || spec.getClass().equals(annotationTypeFilter); - } - - /** - * Returns {@code true} if the column represented by the given column is visible in the - * view. - */ - public boolean passesColumnFilter(ColumnHandle columnHandle) { - return (!filterColumnName || passesNameFilter(getColumnName(columnHandle))) && - passesSelectedElementTypeFilter(columnHandle.getEntry()) && - passesAnnotationTypeFilter(columnHandle.getAnnotatedSpecification()); - } - - /** - * Returns {@code true} if the rows represented by {@code annotationEntry} are visible - * in the view. - */ - public boolean passesRowFilter(AnnotationEntry annotationEntry) { - if(!(annotationEntry.getModelElement() instanceof INamedElement)) { - return true; - } - - return (!filterRowName || passesNameFilter(((INamedElement)annotationEntry - .getModelElement()).getName())) && - passesSelectedElementTypeFilter(annotationEntry); - } - - /** Sets the model element / annotation name filter pattern. */ - public void setNameFilterPattern(String filterPattern) { - this.filterPattern = filterPattern; - } - - /** Sets the flag whether rows should be filtered by name. */ - public void setFilterRowName(boolean filterRowName) { - this.filterRowName = filterRowName; - } - - /** Sets the flag whether columns should be filtered by name. */ - public void setColumnRowName(boolean filterColumnName) { - this.filterColumnName = filterColumnName; - } - - /** Sets the flag whether the view should be filtered by the selected model element type. */ - public void - setRestrictToSelectedModelElementType(boolean restrictToSelectedModelElementType) { - this.restrictToSelectedModelElementType = restrictToSelectedModelElementType; - } - - /** Sets the model element hierarchy level filter option. */ - public void setHierarchyLevelFilter(String hierarchyLevelFilter) { - this.hierarchyLevelFilter = hierarchyLevelFilter; - } - - /** Sets the annotation type filter option. */ - public void setAnnotationTypeFilter( - Class<? extends IAnnotatedSpecification> annotationTypeFilter) { - this.annotationTypeFilter = annotationTypeFilter; - } - } - /** Widget to set content filters for the {@link GenericAnnotationView}. */ private class AnnotationFilterWidget extends Composite { /** Annotation type filter: all annotations */ @@ -606,7 +452,7 @@ public class GenericAnnotationView extends AnnotationViewPartBase { return; } view.getAnnotationFilter().setFilterRowName(true); - view.getAnnotationFilter().setColumnRowName(false); + view.getAnnotationFilter().setFilterColumnName(false); view.update(); } }); @@ -625,7 +471,7 @@ public class GenericAnnotationView extends AnnotationViewPartBase { return; } view.getAnnotationFilter().setFilterRowName(false); - view.getAnnotationFilter().setColumnRowName(true); + view.getAnnotationFilter().setFilterColumnName(true); view.update(); } }); @@ -767,13 +613,47 @@ public class GenericAnnotationView extends AnnotationViewPartBase { } } + /** + * Sets a fixed {@link AnnotationFilter}. + * <ul> + * <li>If the {@link AnnotationFilter} is non-{@code null}, it sets the filter and disables the + * {@link AnnotationFilterWidget}. For instance, this can be used to embed / extend the + * {@link GenericAnnotationView} into a specialized view dedicated to a particular model type.</li> + * <li>Otherwise, this method reinitializes the {@link AnnotationFilterWidget}.</li> + * </ul> + */ + public void setFixedAnnotationFilter(AnnotationFilter annotationFilter) { + + // Remove old table row filter + tableViewer.removeFilter(this.annotationFilter); + + if(annotationFilter != null) { + // Externally created filter -> remove filter option GUI + this.annotationFilter = annotationFilter; + if(annotationFilterWidget != null) { + annotationFilterWidget.dispose(); + annotationFilterWidget = null; + } + } else { + // No externally created filter -> setup filter option GUI + this.annotationFilter = new AnnotationFilter(); + setupAnnotationFilterWidget(); + } + + // Add new table row filter + tableViewer.addFilter(this.annotationFilter); + + // Update layout + rootComposite.layout(true, true); + } + /** Returns the view's {@link AnnotationFilter}. */ private AnnotationFilter getAnnotationFilter() { return annotationFilter; } /** Computes the level of an {@link IModelElement} in the tree */ - private int getModelElementLevel(EObject o) { + public static int getModelElementLevel(EObject o) { int level = 0; while(o.eContainer() != null) { level++; @@ -788,7 +668,7 @@ public class GenericAnnotationView extends AnnotationViewPartBase { * {@code levelsUp} levels above model element in the hierarchy, or {@code null}, in case * {@code levelsUp} > depth(modelElement}. */ - private EObject getModelElementAncestor(EObject o, int levelsUp) { + public static EObject getModelElementAncestor(EObject o, int levelsUp) { while(o.eContainer() != null && levelsUp > 0) { o = o.eContainer(); levelsUp--; @@ -811,7 +691,12 @@ public class GenericAnnotationView extends AnnotationViewPartBase { /** {@inheritDoc} */ @Override protected void update(Collection<AnnotationEntry> annotationEntries) { - filterWidget.updateAnnotationTypeFilterOptionsComboBox(annotationEntries, this); + // Update filter + annotationFilter.setCurrentySelectedModelElement(getCurrentlySelectedObject()); + if(annotationFilterWidget != null) { + annotationFilterWidget.updateAnnotationTypeFilterOptionsComboBox(annotationEntries, + this); + } // Remember last annotation entries (required to re-draw table after changing the // column/annotation filter @@ -883,11 +768,17 @@ public class GenericAnnotationView extends AnnotationViewPartBase { tableViewer.refresh(); } + /** Initializes the {@link AnnotationFilterWidget}. */ + private void setupAnnotationFilterWidget() { + annotationFilterWidget = new AnnotationFilterWidget(rootComposite, SWT.NULL, this); + annotationFilterWidget.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + } + /** {@inheritDoc} */ @Override public void createPartControl(Composite parent) { super.createPartControl(parent); - Composite rootComposite = new Composite(parent, SWT.NULL); + rootComposite = new Composite(parent, SWT.NULL); rootComposite.setLayout(new GridLayout(1, false)); tableViewer = new TableViewer(rootComposite, SWT.BORDER | SWT.FULL_SELECTION); @@ -896,6 +787,11 @@ public class GenericAnnotationView extends AnnotationViewPartBase { table.setLinesVisible(true); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); + // Install layout for Table in order to ensure that it claims all available vertical space + // in case the + // filter option GUI is removed (see setFixedAnnotationFilter()). + table.setLayout(new FillLayout(SWT.VERTICAL)); + createModelElementColumn(); tableViewer.setComparator(new HierarchicalNameComparator()); @@ -908,9 +804,7 @@ public class GenericAnnotationView extends AnnotationViewPartBase { tableViewer.addFilter(annotationFilter); // Add filter widget - filterWidget = new AnnotationFilterWidget(rootComposite, SWT.NULL, this); - filterWidget.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); - + setupAnnotationFilterWidget(); } /** Creates the (leading) column which displays the model elements */ @@ -953,7 +847,7 @@ public class GenericAnnotationView extends AnnotationViewPartBase { TableViewerColumn column = new TableViewerColumn(tableViewer, SWT.NONE); tableColumn = column.getColumn(); - String specName = getColumnName(columnHandle); + String specName = columnHandle.getColumnName(); tableColumn.setText(specName); column.setEditingSupport(editingSupport); @@ -974,27 +868,6 @@ public class GenericAnnotationView extends AnnotationViewPartBase { } - /** - * Returns the name of a column for a given {@link IAnnotatedSpecification} represented by the - * given {@link ColumnHandle}. - */ - protected String getColumnName(ColumnHandle columnHandle) { - // Determine column name - String specName = - columnHandle.getEntry().getSpecificationAnnotationName( - columnHandle.getAnnotatedSpecification().getClass()); - - if(columnHandle.getInstanceKey() != null) { - if(!specName.isEmpty()) { - specName += MULTIINSTANCE_NAME_SEPARATOR + " "; - } - specName += columnHandle.getInstanceKey(); - } else if(specName == null || specName.isEmpty()) { - specName = "<Unnamed Annotation>"; - } - return specName; - } - /** {@inheritDoc} */ @Override public void setFocus() {