Два раздела Eclipse UI Form, которые захватывают избыточное вертикальное пространство и правильно складываются? - PullRequest
3 голосов
/ 08 февраля 2010

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

Я прочитал формуляр , перепробовал множество вариантов grabExcessVerticalSpace и SWT.FILL и почти все, что может предложить GridData для разделов, но безуспешно. Я также пытался вкладывать клиентов секции в композиты, которые бы grabExcess...Space, но это тоже не помогает. Вызов layout() не помогает, форма перекомпоновывается при сложении разделов, а складывание первого раздела работает нормально.

Вот код для формы с тремя секциями, но в которой две нижние секции в сложенном виде отдают только крошечную часть своего пространства, а не всю, как хотелось бы:

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.SectionPart;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;

public class SectionFormPage extends FormPage {
    private IManagedForm managedForm;

    public SectionFormPage(FormEditor editor) {
        super(editor, "sectionEditor", "title");
    }

    protected void createFormContent(IManagedForm managedForm) {
        this.managedForm = managedForm;
        FormToolkit toolkit = managedForm.getToolkit();
        Composite body = managedForm.getForm().getBody();

        body.setLayout(new GridLayout());

        createSectionWithButton(toolkit, body, new GridData(SWT.FILL, SWT.FILL, true, false));
        createSectionWithButton(toolkit, body, new GridData(SWT.FILL, SWT.FILL, true, true));
        createSectionWithButton(toolkit, body, new GridData(SWT.FILL, SWT.FILL, true, true));

        body.layout();
    }

    private void createSectionWithButton(FormToolkit toolkit, final Composite body, final GridData layoutData) {
        Section section = createSection(toolkit, body, "Section");
        section.setLayoutData(layoutData);
        section.setClient(toolkit.createButton(section, "button", SWT.NONE));
    }

    private Section createSection(final FormToolkit toolkit, final Composite body, String title) {
        Section section = toolkit.createSection(body, Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED);
        section.setText(title);
        managedForm.addPart(new SectionPart(section));
        section.addExpansionListener(new ExpansionAdapter() {
            public void expansionStateChanged(ExpansionEvent e) {
                managedForm.reflow(true);
            }
        });
        return section;
    }
}

Есть указатели? Где должен быть указан этот макет для Разделов, их родителей или Клиентов? Заранее спасибо!

Ответы [ 2 ]

8 голосов
/ 08 февраля 2010

Я, наконец, попросил коллегу взглянуть на это, и вместе мы сразу нашли решение, трюк состоял в том, чтобы просто изменить GridData на , а не grabExcessVerticalSpace при складывании раздела:

private void createSectionWithButton(FormToolkit toolkit, final Composite body, final GridData layoutData) {
    final Section section = createSection(toolkit, body, "Section", layoutData.grabExcessVerticalSpace);
    section.setLayoutData(layoutData);
    section.setClient(toolkit.createButton(section, "button", SWT.NONE));
}

private Section createSection(final FormToolkit toolkit, final Composite body, String title,
        boolean shouldGiveUpVerticalSpaceWhenFolded) {
    final Section section = toolkit.createSection(body, Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED);
    section.setText(title);
    managedForm.addPart(new SectionPart(section));
    if (shouldGiveUpVerticalSpaceWhenFolded) {
        section.addExpansionListener(new ExpansionAdapter() {
            public void expansionStateChanged(ExpansionEvent e) {
                GridData gridData = (GridData) section.getLayoutData();
                gridData.grabExcessVerticalSpace = e.getState();
            }
        });
    }
    section.addExpansionListener(new ExpansionAdapter() {
        public void expansionStateChanged(ExpansionEvent e) {
            managedForm.reflow(true);
        }
    });
    return section;
}

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

0 голосов
/ 09 февраля 2010

Для приложения, над которым я работаю, мы создали собственный класс макета, который проверяет, является ли он ExpandableComposite, или мы изменили данные макета, как вы сделали.

...