javaeclipseswtrcpscrolledcomposite

How to implememt a dynamic sized shell with a ScrolledComposite in eclipse SWT?


I have created a Shell and added a ScrolledComposite to it that contains a Text as its content. But I want the shell to change the size dynamically based on the content size. My implementation is as follows

    shell.setLayout(new GridLayout(1,true));
    ScrolledComposite sc = new ScrolledComposite(shell, SWT.V_SCROLL|SWT.H_SCROLL);
    sc.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).hint(200, 200).create());  

    sc.setExpandHorizontal(true);
    sc.setExpandVertical(true);

    Composite top = new Composite(sc,SWT.NONE);
    top.setLayout(GridLayoutFactory.swtDefaults().numColumns(1).create());

    StyledText styledText = new StyledText(top, SWT.NONE);
    styledText.setText(text);

    StyleRange style = new StyleRange();
    style.start = 0;
    style.length = text.indexOf(":"); //$NON-NLS-1$
    style.fontStyle = SWT.BOLD;     
    styledText.setStyleRange(style);    


    sc.setContent(top);
//  shell.setSize(sc.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    sc.setMinSize(top.computeSize(SWT.DEFAULT, SWT.DEFAULT));

    sc.pack(true);
    shell.setVisible(true);

When I uncomment the commented line in above code, shell is resizing based on content, but unable to achieve scrollbar in this case.

I want to get scrollbar as well if content is beyond certain limit. If the content is within the limit, I do not want the shell to have extra blank space.

Can someone help me here ??


Solution

  • StyledText supports scrolling itself there is no need to using ScrolledComposite:

    Shell shell = new Shell(display, SWT.SHELL_TRIM);
    
    shell.setLayout(new GridLayout());
    
    StyledText text = new StyledText(shell, SWT.V_SCROLL | SWT.H_SCROLL);
    
    text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    
    text.setText(....);
    
    shell.layout();
    
    Point size = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT);
    
    shell.setSize(Math.min(size.x, 100), Math.min(size.y, 100));
    
    shell.open();
    

    Instead of using shell.pack() just call shell.layout and then shell.computeSize to see what the unscrolled size would be. Adjust the size if it is too large and call shell.setSize.