I have ScrolledComposite
which allows only vertical scrolling. (heighthint = 400
).
Within this ScrolledComposite, I have another CompositeA
(height may exceed 400 for scrolling) to store all other widgets.
I have a very long label (with SWT.WRAP
enabled). But instead of wrapping, it is always showing in a single line. I want this label to wrap according to the width of its parent (CompositeA
)
I forgot to add that this CompositeA
is a 2 column GridLayout
with makeColumnsEqualWidth = true
.
Here is my code:
public void createPartControl(Composite parent) {
// TODO Auto-generated method stub
Display display = parent.getDisplay();
toolkit = new FormToolkit(display);
form = toolkit.createForm(parent);
form.setText("ABC");
Composite body = form.getBody();
TableWrapLayout layout = new TableWrapLayout();
layout.numColumns = 2;
body.setLayout(layout);
Label header1 = toolkit.createLabel(body, "ABC: ");
Font font = new Font(display, "Arial", 11, SWT.BOLD);
header1.setFont(font);
Label header2 = toolkit.createLabel(body, "XYZ",
SWT.WRAP);
font = new Font(display, "Arial", 11, SWT.NONE);
header2.setFont(font);
TableWrapData wd = new TableWrapData(TableWrapData.FILL_GRAB);
header2.setLayoutData(wd);
form.getBody().setBackground(
form.getBody().getDisplay()
.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
// Scrolled composite
ScrolledComposite sc = new ScrolledComposite(body, SWT.BORDER_SOLID
| SWT.V_SCROLL);
sc.setAlwaysShowScrollBars(true);
sc.setBackground(new Color(display, 50,255,155));
wd = new TableWrapData(TableWrapData.FILL);
wd.heightHint = 360;
wd.colspan = 2;
wd.grabHorizontal = false;
sc.setLayoutData(wd);
sc.setLayout(new TableWrapLayout());
Composite innerComposite = toolkit.createComposite(sc);
sc.setContent(innerComposite);
innerComposite.setLayout(new TableWrapLayout());
innerComposite.setBackground(new Color(display, 255,50,50));
Section section = toolkit.createSection(innerComposite,
Section.DESCRIPTION | Section.TITLE_BAR | Section.EXPANDED);
wd = new TableWrapData(TableWrapData.FILL);
wd.maxWidth = 600; // don't want to hardcode this value
section.setLayoutData(wd);
section.setText("Section");
section.setDescription("A not so long description......................");
// Composite for Section
Composite sectionClient = toolkit.createComposite(section);
layout = new TableWrapLayout();
layout.numColumns = 2;
layout.makeColumnsEqualWidth = true;
sectionClient.setLayout(layout);
toolkit.createButton(sectionClient, "Button 1", SWT.RADIO);
Label rightDesc = toolkit
.createLabel(
sectionClient,
"A very long long long long long long long long long long long long long long long long long long long long desc that needs wrapping",
SWT.WRAP);
font = new Font(display, "Arial", 10, SWT.ITALIC);
rightDesc.setFont(font);
wd = new TableWrapData();
wd.rowspan = 2;
rightDesc.setLayoutData(wd);
Combo comboDropDown = new Combo(sectionClient, SWT.DROP_DOWN
| SWT.BORDER);
comboDropDown.setText("DDL");
comboDropDown.add("1");
comboDropDown.add("2");
comboDropDown.add("3");
Label lineBreak = toolkit.createSeparator(sectionClient, SWT.SEPARATOR
| SWT.HORIZONTAL);
wd = new TableWrapData(TableWrapData.FILL);
wd.colspan = 2;
lineBreak.setLayoutData(wd);
/***********************/
toolkit.createButton(sectionClient, "Button 2", SWT.RADIO);
Label rightDesc2 = toolkit
.createLabel(
sectionClient,
"A long long long long long long long long long long long long long long long long long long long long desc that needs wrapping",
SWT.WRAP);
font = new Font(display, "Arial", 10, SWT.ITALIC);
rightDesc2.setFont(font);
wd = new TableWrapData(TableWrapData.FILL);
wd.rowspan = 3;
rightDesc2.setLayoutData(wd);
toolkit.createLabel(sectionClient, "Desc",
SWT.WRAP);
toolkit.createText(sectionClient, "hello world", SWT.NONE);
section.setClient(sectionClient);
innerComposite.pack();
}
If you run it, you can see a green scrolledcomposite and a red composite. I want the red composite width to fill to the width of the scrolledcomposite relatively without hardcoding maxWidth = 600
.
I have the same problem here in my layout and found this useful answer.
Because of 'it is a not bug, it is a feature' try this answer from comment #19 here.
I use the following lines of code for my Label.
Label tip = new Label(shell, SWT.WRAP | SWT.BORDER | SWT.LEFT);
final GridData data = new GridData(SWT.HORIZONTAL, SWT.TOP, true, false, 1, 1);
tip.setLayoutData(data);
tip.setText("Here stands my long, long and much more longer text...");