添加DecoratingStyledCellLabelProvider

时间:2015-06-25 10:55:01

标签: eclipse-plugin eclipse-rcp

我有一个带有ViewerComparator的JFace TableViewer。排序的方向和列在表的选择侦听器上设置。这很好用。

但是,我最近将LabelProvider从DelegatingStyledCellLabelProvider更改为DecoratingStyledCellLabelProvider。在我进行了更改后,表格似乎正在排序 - 列突出显示,方向箭头添加到列标题中。第一列按照我期望的方式按照排序列的值进行排序,但其余行不随之移动。

这是我尝试排序之前表的外观。注意第一列相对于其他值的值。

Before sorting

我排序后。看第二列的值是如何按照它们之前的顺序排列的,即使第一列是按字母顺序排列的?

after sorting

我添加DecoratingStyledCellLabelProvider的代码如下:

        column.setLabelProvider( 
                new DecoratingStyledCellLabelProvider(
                        new MyStyledCellLabelProvider(),
                        MyPlugin.getDefault().getWorkbench().getDecoratorManager(),
                        null ) );

编辑添加比较代码

    @Override
public int compare( final Viewer viewer, final Object e1, final Object e2 ) {
    if( !( e1 instanceof TreeElement<?>  &&  e2 instanceof TreeElement<?> ) ) {
        return super.compare(viewer, e1, e2);
    }

    if(this.sortDirection == SortDirection.NONE) {
        return ((TreeElement<?>) e1).getSortIndex() - ((TreeElement<?>) e2).getSortIndex();
    }

    final IBaseLabelProvider labelProvider = ((ColumnViewer) viewer).getLabelProvider(this.columnNumber);
    if( !(labelProvider instanceof DelegatingStyledCellLabelProvider) ) {
        return super.compare(viewer, e1, e2);
    }
    final IStyledLabelProvider columnLabelProvider = ((DelegatingStyledCellLabelProvider) labelProvider).getStyledStringProvider();

    final TreeElement<?> treeElement1 = (TreeElement<?>) e1;
    final String text1 = columnLabelProvider.getStyledText(treeElement1).getString();

    final TreeElement<?> treeElement2 = (TreeElement<?>) e2;
    final String text2 = columnLabelProvider.getStyledText(treeElement2).getString();

    // either one could be null
    int result;
    if(text1 == null) {
        result = text2 == null ? 
                    0 : // both null, so they're the same 
                    1;  // only text1 is null, so text2 is greater
    } else {
        result = text2 == null ? 
                    -1 : // only text2 is null, so text1 is greater
                    text1.compareToIgnoreCase(text2); // both not null - do a real text compare 
    }

    // If descending order, flip the direction
    return this.sortDirection == SortDirection.DESCENDING ? -result : result;
}

编辑2:添加标签提供者代码。 我的标签提供商扩展了ColumnLabelProvider并实施了IStyledLabelProvider

    @Override
public StyledString getStyledText(final Object element) {
    if( !(element instanceof TreeElement<?>) ) {
        return null;
    }

    final String elemText = getText(element);
    final StyledString styledString = new StyledString(elemText == null ? "" : elemText);

    if( !(element instanceof MyElement<?,?>) ) {
        return styledString;
    }
    // apply styles as needed
    return styledString;
}

编辑3:决议

我无法解决问题。然而,由于我能够改变设计,因此无论如何我都不需要DecoratingStyledCellLableProvider,因此它没有实际意义。谢谢你的帮助!

0 个答案:

没有答案