org.eclipse.swt.text, автоматически обрезать текст? - PullRequest
0 голосов
/ 13 мая 2011

У меня есть org.eclipse.swt.text виджет. Иногда виджет недостаточно велик, чтобы отображать в нем всю информацию, есть ли способ изменить способ отображения информации без изменения фактического содержимого?

То есть, он должен показывать "1234 ... 4321", но когда я делаю getText(), он должен возвращать фактическое значение "123456654321".

Или есть другой виджет SWT, который может справиться с этим?

Ответы [ 2 ]

9 голосов
/ 13 мая 2011

К сожалению, вы не можете сделать с org.eclipse.swt.widgets.Text, потому что SWT фактически работает с набором собственных виджетов, и в большинстве ОС у виджета с собственным текстом может быть одно состояние, т.е. значение.

Обходной путь - либо высоздайте org.eclipse.swt.widgets.Text с SWT.MULTI|SWT.WRAP флажками или оберните исходный текстовый виджет в служебный класс.

>>Output

enter image description here

>>Sample Wrapper Code

import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;

public class MyText
{
    private Text text;
    private String value;
    public MyText(Composite parent, int style) {
        text = new Text(parent, style);
    }

    public Text getControl() {
        return text;
    }

    public String getText() {
        return value;
    }

    public void setText(String value) {
        if(text != null && !text.isDisposed()){
            this.value = value;
            text.setText(shortenText(value, text.getParent()));
        }
    }

    private String shortenText(String textValue, Control control)
    {
        if (textValue == null) {
            return null;
        }
        GC gc = new GC(control);
        int maxWidth = control.getBounds().width - 25;
        int maxExtent = gc.textExtent(textValue).x;

        System.out.println(maxWidth + "\n" + maxExtent);
        if (maxExtent < maxWidth) {
            gc.dispose();
            return textValue;
        }
        int length = textValue.length();
        int charsToClip = Math.round(0.95f*length * (1 - ((float)maxWidth/maxExtent)));
        int pivot = length / 2;
        int start = pivot - (charsToClip/2);
        int end = pivot + (charsToClip/2) + 1;
        while (start >= 0 && end < length) {
            String s1 = textValue.substring(0, start);
            String s2 = textValue.substring(end, length);
            String s = s1 + "..." + s2;
            int l = gc.textExtent(s).x;
            if (l < maxWidth) {
                gc.dispose();
                return s;
            }
            start--;
            end++;
        }
        gc.dispose();
        return textValue;
    }
}

Примечание реализация метода shortenText().

>>Main

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class TextWidgetTest 
{
    public static void main(String[] args) 
    {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("Text Widget Test");
        shell.setLayout(new GridLayout());
        shell.setSize(300, 200);

        final MyText text = new MyText(shell, SWT.SINGLE|SWT.BORDER);
        text.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        text.setText("A very very very very very very very very very very very very very very very very very very very very long text");

        Button show = new Button(shell, SWT.PUSH);
        show.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        show.setText("Show Actual Text");


        final Text console = new Text(shell, SWT.BORDER|SWT.MULTI|SWT.WRAP|SWT.V_SCROLL);
        console.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        show.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                console.setText(text.getText());
            }
        });

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }

}
1 голос
/ 13 мая 2011

Будет ли хорошим вариантом для вас создание элемента управления с установленными флагами SWT.MULTI | SWT.WRAP? Таким образом, вы получаете многострочный элемент управления, который переносит текст.

Вот как это сделать:

Text myText = new Text(parent, SWT.MULTI|SWT.WRAP);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...