Eclipse SWT: невозможно прокрутить текст, если включена вертикальная прокрутка - PullRequest
0 голосов
/ 04 марта 2019

У меня есть Текст внутри Группы , которая находится внутри Composite и находится внутри ScrolledComposite .Все элементы находятся внутри EditorPart .

ScrolledComposite mySc
|- Composite myComposite
   |- Group myGroup
      |- Text myText

Я могу прокручивать (используя колесо мыши) все элементы в EditorPart, но когда курсор находится над областью текста, прокруткаостанавливается.Я хочу прокручивать текст только тогда, когда он имеет фокус клавиатуры.

Создание текста myText:

myText = new Text(myGroup, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);

Без SWT.V_SCROLL работает, но тогда у меня нет прокруткиполосы и возможность прокрутки в тексте.

Я подумал, что мог бы, возможно, использовать forceFocus() на родительском элементе, если текст не имеет элемента управления фокусом:

myText.addListener(SWT.MouseWheel, new Listener() {
    @Override
    public void handleEvent(Event event) {
        if (!commandText.isFocusControl()) {
            System.out.println("no focus");
            Control wheelControl = myText.getParent();

            Point cursorPos = wheelControl.toControl(event.display.getCursorLocation());
            event.x = cursorPos.x;
            event.y = cursorPos.y;
            event.widget = wheelControl;
            wheelControl.forceFocus();
            wheelControl.notifyListeners(SWT.MouseWheel, event);
        } else {
            System.out.println("Focus control");
        }
    }
});

Но это не такт работа.Без изменений вообще.Правильно печатается только «Управление фокусом» и «Без фокуса».

РЕДАКТИРОВАТЬ :

Вот минимальный рабочий пример:

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.EditorPart;

public class MyEditor extends EditorPart {

    private Text myText;
    private boolean dirty = false;

    public MyEditor() {
        super();
    }

    @Override
    public void init(IEditorSite site, IEditorInput input) {
        setSite(site);
        setInput(input);
    }


    @Override
    public void doSave(IProgressMonitor monitor) {
        return;
    }


    @Override
    public void doSaveAs() {
        return;
    }


    @Override
    public boolean isDirty() {
        return dirty;
    }


    @Override
    public boolean isSaveAsAllowed() {
        return false;
    }


    @Override
    public void createPartControl(Composite parent) {
        parent.setLayout(new FillLayout());

        ScrolledComposite mySc = new ScrolledComposite(parent, SWT.V_SCROLL);
        Composite myComposite = new Composite(mySc, SWT.BORDER);
        myComposite.setLayout(new GridLayout(1, false));

        // Set the child as the scrolled content of the ScrolledComposite
        mySc.setContent(myComposite);
        // Expand both horizontally and vertically
        mySc.setExpandHorizontal(true);
        mySc.setExpandVertical(true);

        Group myGroup = new Group(myComposite, SWT.NONE);
        myGroup.setText("Hello or something");
        myGroup.setLayout(new GridLayout(1, false));
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.verticalIndent = 10;
        myGroup.setLayoutData(gd);

        Label aLabel = new Label(myGroup, SWT.NONE);
        aLabel.setText("You can write here: ");

        myText = new Text(myGroup, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        myText.setText("Some Default Text");
        gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.heightHint = 300;
        gd.horizontalIndent = 10;
        myText.setLayoutData(gd);

        myText.addListener(SWT.MouseWheel, new Listener() {
            @Override
            public void handleEvent(Event event) {
                if (!myText.isFocusControl() ) {
                    System.out.println("no focus");
                    Control wheelControl = myText.getParent();

                    Point cursorPos = wheelControl.toControl(event.display.getCursorLocation());
                    event.x = cursorPos.x;
                    event.y = cursorPos.y;
                    event.widget = wheelControl;
                    wheelControl.forceFocus();
                    wheelControl.notifyListeners(SWT.MouseWheel, event);
                    myText.setCapture(false);
                } else {
                    System.out.println("Focus control");
                    myText.setCapture(true);
                }
            }
        });

        mySc.setMinSize(myComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        // TODO Auto-generated method stub
    }

    @Override
    public void setFocus() {
        // TODO Auto-generated method stub
    }
}

1 Ответ

0 голосов
/ 05 марта 2019

Решение, которое я нашел, было отключить вертикальную полосу прокрутки.Это также отключает прокрутку колесиком мыши.Также используйте методы addMouseWheelListener() и mouseScrolled() SWT вместо addListener().Затем просто прокрутите ScrolledComposite, используя метод getOrigin().

myText.addMouseWheelListener(new MouseWheelListener() {
    @Override
    public void mouseScrolled(MouseEvent e) {
        if (!myText.isFocusControl() ) {
            myText.getVerticalBar().setEnabled(false);
            if (e.count == 3) {
                mySc.setOrigin(sc.getOrigin().x, mySc.getOrigin().y - 30);
            } else if (e.count == -3) {
                mySc.setOrigin(sc.getOrigin().x, mySc.getOrigin().y + 30);
            }
        } else {
            myText.getVerticalBar().setEnabled(true);
        }
    }
});

count всегда возвращает 3 или -3, в зависимости от направления прокрутки.Значение 30 для прокрутки вверх / вниз хорошо для меня, может быть более или менее для других целей.Я еще не проверял поведение на компьютере с Windows.

...