2010-02-08 3 views
3

J'essaie de créer un formulaire Eclipse qui a trois sections pliables, une taille fixe et deux autres qui devraient saisir tout l'espace vertical restant dans la fenêtre de l'éditeur de sorte que lorsque l'une des sections du bas est pliée, l'autre remplirait tout l'espace disponible.Deux sections de l'interface utilisateur Eclipse qui saisissent l'espace vertical excédentaire et se replient correctement?

J'ai lu le forms article, a essayé de nombreuses variantes de grabExcessVerticalSpace et SWT.FILL « s et à peu près tout le gridData pour les sections a à offrir, mais pas de chance. J'ai également essayé d'imbriquer les clients de la section dans les composites qui seraient grabExcess...Space, mais cela n'aide pas non plus. Appeler layout() n'aide pas, la forme se redresse lorsque les sections sont pliées, et le pliage de la première section fonctionne bien.

Voici le code pour un formulaire avec trois sections, mais dans lequel les deux sections du bas donnent seulement une infime partie de leur espace lorsqu'il est plié, pas tous comme je voudrais:

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; 
    } 
} 

Tous pointeurs? Où cette disposition devrait-elle être spécifiée, pour les sections ou pour leurs parents ou clients? Merci d'avance!

Répondre

8

J'ai finalement eu un collègue pour examiner cette question et ensemble nous avons trouvé une solution immédiatement, l'astuce était de modifier simplement le GridData-pasgrabExcessVerticalSpace lorsque la section est pliée:

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; 
} 

J'étais coincé avec mon idée qu'il doit être possible de définir cela avec la mise en page en quelque sorte. Je serais toujours intéressé de savoir si c'est le cas.

0

Pour l'application sur laquelle je travaille, nous avons créé une classe de disposition personnalisée qui vérifie s'il s'agit d'un composant ExpandableComposite ou si nous avons modifié les données de disposition comme vous l'avez fait.

+0

Ok, merci pour la confirmation! – hvrauhal

Questions connexes