Нет полос прокрутки в ScrolledComposite в RCP/RAP

У меня есть фрагмент кода с ScrolledComposite, где вертикальная полоса прокрутки не отображается, даже если содержимое виджетов намного больше, чем пространство в виджете. Я смог воспроизвести это поведение на простом примере. Мне нужно, чтобы это работало как приложение RAP, но код также не работает, если я запускаю его в представлении в приложении RCP.

Вот код для простого представления (я опускаю часть импорта):

public class View extends ViewPart {
    public static final String ID = "View_spike.view";

    List<String> inputData = new ArrayList<String>();
    final String LONG_TEXT = "Some long text. Some long text. Some long text. Some long text. Some long text. Some long text. Some long text.";


    private TableViewer viewer;

    /**
     * The content provider class is responsible for providing objects to the
     * view. It can wrap existing objects in adapters or simply return objects
     * as-is. These objects may be sensitive to the current input of the view,
     * or ignore it and always show the same content (like Task List, for
     * example).
     */
    class ViewContentProvider implements IStructuredContentProvider {
        public void inputChanged(Viewer v, Object oldInput, Object newInput) {
        }

        public void dispose() {
        }

        public Object[] getElements(Object parent) {
            if (parent instanceof Object[]) {
                return (Object[]) parent;
            }
            return new Object[0];
        }
    }

    class ViewLabelProvider extends LabelProvider implements
            ITableLabelProvider {
        public String getColumnText(Object obj, int index) {
            return getText(obj);
        }

        public Image getColumnImage(Object obj, int index) {
            return getImage(obj);
        }

        public Image getImage(Object obj) {
            return PlatformUI.getWorkbench().getSharedImages().getImage(
                    ISharedImages.IMG_OBJ_ELEMENT);
        }
    }

    /**
     * This is a callback that will allow us to create the viewer and initialize
     * it.
     */
    public void createPartControl(Composite parent) {
        populateInputData();

        final SashForm container = new SashForm(parent, SWT.HORIZONTAL);
        final ScrolledComposite objectViewerContainer = new ScrolledComposite(
                container, SWT.H_SCROLL | SWT.V_SCROLL);
        objectViewerContainer.setLayout(new GridLayout());
        objectViewerContainer.setExpandHorizontal(true);
        objectViewerContainer.setExpandVertical(true);
        objectViewerContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        final Composite someContainer = new Composite(container, SWT.NONE);
        someContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        container.setWeights(new int[] { 1, 2 }); 
        container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        createObjectViewerArea(objectViewerContainer);
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    public void setFocus() {
        viewer.getControl().setFocus();
    }


    private  void populateInputData() {
        for(int i = 0; i < 100; i++) {
            inputData.add(LONG_TEXT);
        }

    }

    private void createObjectViewerArea(final ScrolledComposite parent) {
        final Composite panel = new Composite(parent, SWT.NONE);
        panel.setLayout(resetMargin(new TableWrapLayout()));
        createContent(panel);
        panel.setLayoutData(new GridData(GridData.FILL_BOTH));
        parent.setContent(panel);
    }

    private void createContent(final Composite parent) {
        final Tree tree = new Tree(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        tree.setLayoutData(new TableWrapData());
        TreeViewer treeViewer = new TreeViewer(tree);

        treeViewer.setContentProvider(new ITreeContentProvider() {

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

            }

            @Override
            public void inputChanged(Viewer viewer, Object oldInput,
                    Object newInput) {
                viewer.refresh();
                parent.layout();
            }

            @Override
            public Object[] getElements(Object inputElement) {
                // TODO Auto-generated method stub
                return ((List) inputData).toArray();
            }

            @Override
            public Object[] getChildren(Object parentElement) {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public Object getParent(Object element) {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public boolean hasChildren(Object element) {
                // TODO Auto-generated method stub
                return false;
            }

        });
        treeViewer.setInput(this.inputData);
        treeViewer.setAutoExpandLevel(1); // don't expand past top level
        treeViewer.setLabelProvider(new ILabelProvider() {

            @Override
            public void removeListener(ILabelProviderListener listener) {

            }

            @Override
            public boolean isLabelProperty(Object element, String property) {
                return false;
            }

            @Override
            public void dispose() {

            }

            @Override
            public void addListener(ILabelProviderListener listener) {

            }

            @Override
            public String getText(Object element) {
                // TODO Auto-generated method stub
                return (String) element;
            }

            @Override
            public Image getImage(Object element) {
                // TODO Auto-generated method stub
                return null;
            }
        });
    }

    public TableWrapLayout resetMargin(final TableWrapLayout layout) {
        layout.topMargin = 0;
        layout.leftMargin = 0;
        layout.bottomMargin = 1;
        layout.rightMargin = 0;
        layout.horizontalSpacing = 0;
        layout.verticalSpacing = 0;
        return layout;
    }

}

Результат следующий: введите здесь описание изображения

Конечно, в виджете дерева строк больше, чем отображается (код добавляет 100 объектов). Я ожидаю, что в виджете дерева появятся полосы прокрутки (как вертикальные, так и горизонтальные). Любые идеи, что я должен улучшить в своем коде?


person Jakub    schedule 29.01.2015    source источник
comment
Вы изучили фрагменты SWT для ScrolledComposite? Там вы должны найти пример, который вы можете адаптировать для своего варианта использования.   -  person Rüdiger Herrmann    schedule 29.01.2015


Ответы (1)


Есть два способа использования ScrolledComposite (и ни один из них не используется в вашем фрагменте). См. javadoc для ScrolledComposite http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fswt%2Fcustom%2FScrolledComposite.html

person Severin    schedule 30.01.2015