Вырезать текст всплывающей подсказки jface tableviewer

Я использую средство просмотра таблиц jface в приложении eclipse rcp для отображения некоторых значений.

Поэтому я написал следующее отрезанное ...

    tableviewer = new TableViewer(container, SWT.FULL_SELECTION | SWT.BORDER | SWT.SINGLE);
    tableviewer.setContentProvider(new ArrayContentProvider());

    ColumnViewerToolTipSupport.enableFor(tableviewer, ToolTip.RECREATE);

    final Table table = tableviewer.getTable();
    table.setHeaderVisible(true);
    table.setLinesVisible(true);

    TableViewerColumn column = new TableViewerColumn(tableviewer, SWT.NONE);
    column.getColumn().setText("col1");
    column.getColumn().setResizable(true);
    column.setLabelProvider(new ConfigLabelProvider("col1"));

А вот здесь определение ConfigLabelProvider

private class ConfigLabelProvider extends StyledCellLabelProvider {

    private String property;

    public ConfigLabelProvider(String property) {
        this.property = property;
    }

    @Override
    public void update(ViewerCell cell) {

        GenericConfigInterfaceEntity config = (GenericConfigInterfaceEntity) cell.getElement();

        switch (property) {
        case "col1":
            cell.setText(AppHelper.preventNull("col1Text col1Text col1Text col1Text col1Text"));
            break;
        case ...
        }

        super.update(cell);

    }

}

Теперь моя проблема заключается в том, что если столбец слишком мал, отображается всплывающая подсказка по умолчанию, пытающаяся показать полное текстовое значение ячейки.

НО я получаю всплывающую подсказку, которая достаточно велика для всего текста, но текст не отображается за пределами прямоугольника ячейки.

Если я расширим ConfigLabelProvider из CellLabelProvider, всплывающая подсказка появится, как и ожидалось...

Но мне нужен метод рисования StyledCellLabelProvider.

Любые идеи?


Изменить 1

Я написал небольшой проект примера Java, используя SWT и JFACE, потому что мои проблемы все еще остаются.

Моя цель - иметь таблицу с фоном ячейки без наведения мыши (потому что вместе это выглядит некрасиво) и пользовательскую всплывающую подсказку.

Вот моя реализация TestTable

package main;

import java.util.ArrayList;
import java.util.List;

import model.TestModel;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

public class TestTable extends Dialog {

    private TableViewer tableviewer;
    private List<TestModel> entities;

    protected TestTable(Shell parentShell) {
        super(parentShell);
    }

    @Override
    public void create() {

        super.create();

        loadData();

    }

    @Override
    protected Control createDialogArea(Composite parent) {

        GridData dataLayout;

        Composite area = (Composite) super.createDialogArea(parent);

        dataLayout = new GridData(GridData.FILL_BOTH);
        dataLayout.heightHint = 150;
        dataLayout.widthHint = 500;

        Composite wrapper = new Composite(area, SWT.NONE);
        wrapper.setLayoutData(dataLayout);
        wrapper.setLayout(new FillLayout());

        tableviewer = new TableViewer(wrapper, SWT.BORDER | SWT.MULTI);
        tableviewer.setContentProvider(new ArrayContentProvider());

        ColumnViewerToolTipSupport.enableFor(tableviewer);

        final Table table = tableviewer.getTable();
        table.setLinesVisible(true);
        table.setHeaderVisible(true);

        createColumns(wrapper);

        return area;

    }

    private void createColumns(Composite wrapper) {

        TableViewerColumn firstnameColumn = new TableViewerColumn(tableviewer, SWT.NONE);
        firstnameColumn.getColumn().setText("Vorname");
        firstnameColumn.setLabelProvider(new StyledCellLabelProvider(StyledCellLabelProvider.COLORS_ON_SELECTION) {

            @Override
            public void initialize(ColumnViewer viewer, ViewerColumn column) {
                super.initialize(viewer, column);
                this.setOwnerDrawEnabled(false);
            }

            @Override
            public void update(ViewerCell cell) {
                TestModel model = (TestModel) cell.getElement();
                cell.setText(model.getFirstname());
                cell.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_DARK_GREEN));
            }

            @Override
            public String getToolTipText(Object element) {
                TestModel model = (TestModel) element;
                return "USE THIS AS TOOLTIP";
            }

        });

        TableViewerColumn lastnameColumn = new TableViewerColumn(tableviewer, SWT.NONE);
        lastnameColumn.getColumn().setText("Nachname");
        lastnameColumn.setLabelProvider(new StyledCellLabelProvider(StyledCellLabelProvider.COLORS_ON_SELECTION) {

            @Override
            public void initialize(ColumnViewer viewer, ViewerColumn column) {
                super.initialize(viewer, column);
                this.setOwnerDrawEnabled(false);
            }

            @Override
            public void update(ViewerCell cell) {
                TestModel model = (TestModel) cell.getElement();
                cell.setText(model.getLastname());
                cell.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_DARK_GREEN));
            }

            @Override
            public String getToolTipText(Object element) {
                TestModel model = (TestModel) element;
                return "USE THIS AS TOOLTIP";
            }

        });

        for (TableColumn c : tableviewer.getTable().getColumns()) {
            c.pack();
        }

    }

    private void loadData() {

        entities = new ArrayList<TestModel>();

        entities.add(new TestModel("___Firstname1___", "Lastname1", "Username1", "Kommentar"));
        entities.add(new TestModel("___Firstname2___", "Lastname2", "Username2", "Kommentar"));
        entities.add(new TestModel("___Firstname3___", "Lastname3", "Username3", "Kommentar"));
        entities.add(new TestModel("___Firstname4___", "Lastname4", "Username4", "Kommentar"));
        entities.add(new TestModel("___Firstname5___", "Lastname5", "Username5", "Kommentar"));

        tableviewer.setInput(entities);
        tableviewer.refresh();

    }

}

А вот и неудачные картинки

Здесь отображается собственная подсказка TableViewer и моя пользовательская подсказка, а также выбирается строка (COLORS_ON_SELECTION должен предотвратить это)

ошибка всплывающей подсказки 1

Здесь во втором столбце не отображается всплывающая подсказка

ошибка всплывающей подсказки 2

И здесь не отображается всплывающая подсказка, и, как вы видите, первая ячейка не заполнена.

ошибка всплывающей подсказки 3

Если я добавлю SWT.FULL_SELECTION, появится всплывающая подсказка в столбце 2, но другие проблемы останутся.

Я думаю, что это какая-то ошибка поддержки всплывающих подсказок, или я делаю это совершенно неправильно.


person Pascal    schedule 30.06.2015    source источник
comment
ColumnViewerToolTipSupport ожидает, что вы переопределите поставщика меток getToolTipText для предоставления текста всплывающей подсказки.   -  person greg-449    schedule 30.06.2015
comment
ок спасибо понял! Но теперь всплывающая подсказка отображается в каждом столбце, а не только в том случае, если текст больше ширины столбца. Есть ли какое-либо свойство, которое я могу проверить, чтобы подавить?   -  person Pascal    schedule 30.06.2015
comment
Я предоставляю TableViewerColumn в конструкторе и вычисляю ширину строки с помощью GC.stringExtent.x по сравнению с column.getColumn().getWidth()   -  person Pascal    schedule 30.06.2015


Ответы (1)


Это решило мою проблему

https://stackoverflow.com/a/28991593/1822033

Нижележащий второй наконечник был показан, потому что колонка была слишком узкой. Установка tableviewer.getTavle().setTooltipText(""); перестал показывать родной наконечник.

Установка его на ноль все равно отображает его!

person Pascal    schedule 16.07.2015