0
votes

I need to draw multiple canvases on a Scrollable Composite in Eclipse rcp, and put them in a gridlayout. I managed to achieve this, but I'm stuck with adjusting the GridLayouts Cell-Size.

What I would like to have is for the grid to dynamically adjust the size of each canvas (or at least set the size manually) but make the GridLayout fill the complete space of the parent component.

What I have so far:

public class Test {
  public static void main(final String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display);

    shell.setLayout(new FillLayout());

    final ScrolledComposite sComp = new ScrolledComposite(shell, SWT.H_SCROLL | SWT.V_SCROLL);
    final Composite fillComp = new Composite(sComp, SWT.NONE);

    GridLayoutFactory.createFrom(new GridLayout(10, true)).applyTo(fillComp);

    for (int i = 0; i < 500; i++) {
      final Canvas c = new Canvas(fillComp, SWT.DOUBLE_BUFFERED);
      c.addPaintListener(new PaintListener() {
        public void paintControl(PaintEvent e) {
          e.gc.setBackground(display.getSystemColor(new Random().nextInt(20)));
          e.gc.fillRectangle(0, 0, 200, 200);
        }
      });
    }

    sComp.setContent(fillComp);

    fillComp.pack();
    shell.open();
    shell.pack();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }
  }
}

I assumed that setting the Parent Component's layout to FillLayout would do the trick, but it doesn't work. I think I need to work with a GridData Object, but I'm a little lost here.

1

1 Answers

0
votes

you can create two GridData Objects and set values for them, one for Deactive Cells and one for Active Cells. for example:

GridData Acrive = new GridData();
Active.widthHint = 200;
Active.heightHint = 200;

GridData Deactive = new GridData();
Deactive.widthHint = 100;
Deactive.heightHint = 100;

then in the Listener Method you can manage the current Canvas Cell-Size by set its LayoutData, like:

c.setLayoutData(Active);

or

c.setLayoutData(Deactive);