2012-04-16 2 views
2

Это вопрос, какой общий подход взять, поэтому я не включил какой-либо код.Заполнить видимую область редактора Eclipse RCP без прокрутки

Требование: Мне нужно создать страницу в многостраничном редакторе, в котором есть две вертикальные секции. Верхняя часть имеет дерево, а в нижней части - текстовое поле. Дерево и текстовое поле должны заполнить соответствующие разделы. Каждый раздел должен прокручиваться независимо, и между ними должен быть разветвитель. Когда редактор открывается, я хочу, чтобы видимая область редактора была разделена между двумя разделами на основе некоторого соотношения, которое я предоставляю. Затем, когда редактор изменяется, эти два раздела будут корректироваться пропорционально, чтобы поддерживать соотношение и соответствовать странице. Таким образом, на самой странице редактора не будут полосы прокрутки, а только две секции.

Предлагаемое решение: Моя идея состояла в том, чтобы добавить SashForm на страницу редактора и установить размер SashForm быть такой же, как видимая область редактора. Затем я добавлю реселлера на страницу редактора и отрегулирую размер SashForm так, чтобы он оставался в синхронизации со страницей. Однако я не могу найти способ получить видимую область редактора. Поэтому, когда я добавляю SashForm, он просто делает каждый раздел достаточно большим, чтобы соответствовать его данным, и добавляет прокрутку на самой странице редактора.

Возможно ли удовлетворить мое требование?

ответ

2

Успех! Ключ должен был прослушивать события изменения размера на ScrolledForm. Я тестировал только Fedora, но я скоро посмотрю на Windows. Единственное, что меня беспокоит, это то, что использование буферных констант кажется немного взломанным.

/** 
* Form page that contains a sash form and a button. The sash form is dynamically sized to ensure 
* that it always fills the available space on the page. 
*/ 
public class SashFormDemoPage extends FormPage 
{ 
    /** Horizontal buffer needed to ensure that content fits inside the page */ 
    private static final int HORIZONTAL_BUFFER = 8; 
    /** Vertical buffer needed to ensure that content fits inside the page */ 
    private static final int VERTICAL_BUFFER = 12; 

    /** Percentages of the sash form occupied by the tree and text box respectively */ 
    private static final int[] SASH_FORM_WEIGHTS = new int[] {30, 70}; 


    /** 
    * Constructor 
    * 
    * @param editor parent editor 
    */ 
    public SashFormDemoPage(ComponentEditor editor) 
    { 
     super(editor, "sashFormDemoPage", "Demo"); 
    } 


    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    protected void createFormContent(IManagedForm managedForm) 
    { 
     // Set page title 
     ScrolledForm scrolledForm = managedForm.getForm(); 
     scrolledForm.setText("SashForm Demo"); 

     // Set page layout and add a sash form 
     final Composite parent = scrolledForm.getBody(); 
     parent.setLayout(new GridLayout()); 
     final SashForm sashForm = new SashForm(parent, SWT.VERTICAL); 

     // Add a tree as the top row of the sash form and fill it with content 
     FormToolkit toolkit = managedForm.getToolkit(); 
     int style = SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER; 
     Tree tree = toolkit.createTree(sashForm, style); 

     for (int i = 0; i < 40; i++) { 
      TreeItem parentNode = new TreeItem(tree, SWT.NONE); 
      parentNode.setText("parent-" + i); 
      for (int j = 0; j < 3; j++) { 
       TreeItem childNode = new TreeItem(parentNode, SWT.NONE); 
       childNode.setText("child-" + i + "-" + j); 
      } 
     } 

     // Add a text box as the bottom row of the sash form and fill it with content 
     style = SWT.MULTI | SWT.V_SCROLL | SWT.WRAP | SWT.BORDER; 
     Text text = toolkit.createText(sashForm, null, style); 

     String message = ""; 
     for (int i = 0; i < 100; i++) { 
      message += "This is a test of the layout demo system. This is only a test. "; 
     } 
     text.setText(message); 

     // Add button below sash form 
     final Button button = toolkit.createButton(parent, "Test", SWT.NONE); 

     // Add resize listener to sash form's parent so that sash form always fills the page 
     parent.addControlListener(new ControlListener() { 
      @Override 
      public void controlMoved(ControlEvent e) 
      { 
       // Stub needed to implement ControlListener 
      } 

      @Override 
      public void controlResized(ControlEvent e) 
      { 
       GridData data = new GridData(); 
       Point size = parent.getSize(); 
       data.widthHint = size.x - HORIZONTAL_BUFFER; 
       data.heightHint = size.y - button.getSize().y - VERTICAL_BUFFER; 
       sashForm.setLayoutData(data); 
      } 
     }); 

     // Set sash form's weights and pack its parent so that the initial layout is correct 
     sashForm.setWeights(SASH_FORM_WEIGHTS); 
     parent.pack(); 
    } 
} 
1

Зачем устанавливать размер SashForm явно? Почему бы просто не добавить его к родительскому редактору Composite? У родителя Composite есть FillLayout и, следовательно, SashForm с заполнением области редактора автоматически.

+0

Моя проблема, по крайней мере, как я понимаю, что 'FormPage.getManagedForm(). GetForm()' возвращает экземпляр 'ScrolledForm'. Эта форма автоматически добавит полосы прокрутки для размещения своего содержимого. Поскольку я добавляю свой контент там, страница автоматически расширяется, чтобы соответствовать всему контенту. Таким образом, я получаю полосы прокрутки на всей странице, никогда в отдельных разделах. Я что-то упускаю? – user1155252

+0

Зачем вам нужна 'Formpage'? –

+0

Мой редактор расширяет 'FormEditor', поэтому я переопределял' addPages', Javadoc утверждает, что страницы должны быть добавлены с помощью 'addPage (IFormPage)'. Однако теперь я вижу, что 'FormEditor' также имеет' addPage (Control) '. Я попробую, чтобы посмотреть, могу ли я добавить страницу без прокрутки, соответствующую моим требованиям. Однако я удивляюсь, почему Javadoc из «FormPage» описывает класс как «базовый класс, который все страницы, которые должны быть добавлены в' FormEditor', должны подклассы ». – user1155252

Смежные вопросы