diff --git a/org.eclipse.wb.swing/src/org/eclipse/wb/internal/swing/model/component/ContainerInfo.java b/org.eclipse.wb.swing/src/org/eclipse/wb/internal/swing/model/component/ContainerInfo.java
index cbd5276e02..7391a5eabd 100644
--- a/org.eclipse.wb.swing/src/org/eclipse/wb/internal/swing/model/component/ContainerInfo.java
+++ b/org.eclipse.wb.swing/src/org/eclipse/wb/internal/swing/model/component/ContainerInfo.java
@@ -472,6 +472,12 @@ && getArbitraryValue(JavaInfo.FLAG_MANUAL_COMPONENT) == Boolean.TRUE
// this is first, and last time when we should do processing
putArbitraryValue(KEY_LAYOUT_ALREADY_PROCESSED, Boolean.TRUE);
}
+ // check if a layout is already set in the AST (which might not be known
+ // to the model). This can happen when the layout is set during e.g.
+ // creation in the *.wbp-components.xml file.
+ if (getMethodInvocation("setLayout(java.awt.LayoutManager)") != null) {
+ return;
+ }
// check for inheritance from parent
if (preferences.getBoolean(IPreferenceConstants.P_LAYOUT_OF_PARENT)
&& getParent() instanceof ContainerInfo) {
diff --git a/org.eclipse.wb.swt/src/org/eclipse/wb/internal/swt/model/widgets/CompositeInfo.java b/org.eclipse.wb.swt/src/org/eclipse/wb/internal/swt/model/widgets/CompositeInfo.java
index b6e42e37df..6cf367d7f7 100644
--- a/org.eclipse.wb.swt/src/org/eclipse/wb/internal/swt/model/widgets/CompositeInfo.java
+++ b/org.eclipse.wb.swt/src/org/eclipse/wb/internal/swt/model/widgets/CompositeInfo.java
@@ -536,6 +536,12 @@ && getArbitraryValue(KEY_LAYOUT_ALREADY_PROCESSED) == null
// this is first, and last time when we should do processing
putArbitraryValue(KEY_LAYOUT_ALREADY_PROCESSED, Boolean.TRUE);
}
+ // check if a layout is already set in the AST (which might not be known
+ // to the model). This can happen when the layout is set during e.g.
+ // creation in the *.wbp-components.xml file.
+ if (getMethodInvocation("setLayout(org.eclipse.swt.widgets.Layout)") != null) {
+ return;
+ }
// check for inheritance from parent
if (preferences.getBoolean(IPreferenceConstants.P_LAYOUT_OF_PARENT)
&& getParent() instanceof CompositeInfo) {
diff --git a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swing/model/component/ContainerTest.java b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swing/model/component/ContainerTest.java
index 3c98c1745c..8ab72c6922 100644
--- a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swing/model/component/ContainerTest.java
+++ b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swing/model/component/ContainerTest.java
@@ -359,6 +359,42 @@ public Test() {
*/
@Test
public void test_setDefaultLayout() throws Exception {
+ test_setDefaultLayout("javax.swing.JPanel", """
+ // filler filler filler
+ public class Test extends JPanel {
+ public Test() {
+ {
+ JPanel panel = new JPanel();
+ add(panel);
+ panel.setLayout(new BorderLayout(0, 0));
+ }
+ }
+ }""");
+ }
+
+ /**
+ * Avoid duplicate layouts if one is already set during creation.
+ *
+ * @see here
+ */
+ @Test
+ public void test_setDefaultLayout_skip() throws Exception {
+ prepareMyPanel_withFixedLayout();
+ test_setDefaultLayout("test.MyPanel", """
+ // filler filler filler
+ public class Test extends JPanel {
+ public Test() {
+ {
+ MyPanel myPanel = new MyPanel();
+ add(myPanel);
+ myPanel.setLayout(new GridBagLayout());
+ }
+ }
+ }""");
+
+ }
+
+ private void test_setDefaultLayout(String name, String source) throws Exception {
ContainerInfo panel = parseContainer("""
// filler filler filler
public class Test extends JPanel {
@@ -379,7 +415,7 @@ public Test() {
// add new JPanel
ContainerInfo newPanel;
try {
- newPanel = createJavaInfo("javax.swing.JPanel");
+ newPanel = createJavaInfo(name);
// do add
try {
panel.startEdit();
@@ -393,17 +429,7 @@ public Test() {
preferencesRepairer.restore();
}
// check result
- assertEditor("""
- // filler filler filler
- public class Test extends JPanel {
- public Test() {
- {
- JPanel panel = new JPanel();
- add(panel);
- panel.setLayout(new BorderLayout(0, 0));
- }
- }
- }""");
+ assertEditor(source);
assertNotSame(flowLayout, newPanel.getLayout());
}
@@ -697,4 +723,29 @@ public MyPanel() {
""");
waitForAutoBuild();
}
+
+ /**
+ * Prepares test.MyPanel class which does not accept new
+ * {@link LayoutManager}.
+ */
+ public static void prepareMyPanel_withFixedLayout() throws Exception {
+ setFileContentSrc("test/MyPanel.java", getSource("""
+ // filler filler filler filler filler
+ // filler filler filler filler filler
+ package test;
+ import javax.swing.JPanel;
+ public class MyPanel extends JPanel {
+ public MyPanel() {
+ }
+ }"""));
+ setFileContentSrc("test/MyPanel.wbp-component.xml", """
+
+
+
+
+
+
+ """);
+ waitForAutoBuild();
+ }
}
diff --git a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swt/model/widgets/CompositeTest.java b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swt/model/widgets/CompositeTest.java
index 4db7946c1a..a9c3a33dae 100644
--- a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swt/model/widgets/CompositeTest.java
+++ b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swt/model/widgets/CompositeTest.java
@@ -729,6 +729,40 @@ public Test() {
*/
@Test
public void test_setDefaultLayout() throws Exception {
+ test_setDefaultLayout("org.eclipse.swt.widgets.Composite", """
+ public class Test extends Shell {
+ public Test() {
+ setLayout(new FillLayout());
+ {
+ Composite composite = new Composite(this, SWT.NONE);
+ composite.setLayout(new GridLayout(1, false));
+ }
+ }
+ }""");
+ }
+
+ /**
+ * Avoid duplicate layouts if one is already set during creation.
+ *
+ * @see here
+ */
+ @Test
+ public void test_setDefaultLayout_skip() throws Exception {
+ prepareMyComposite_withFixedLayout();
+ test_setDefaultLayout("test.MyComposite", """
+ public class Test extends Shell {
+ public Test() {
+ setLayout(new FillLayout());
+ {
+ MyComposite myComposite = new MyComposite(this, SWT.NONE);
+ myComposite.setLayout(new BorderLayout());
+ }
+ }
+ }""");
+
+ }
+
+ private void test_setDefaultLayout(String name, String source) throws Exception {
CompositeInfo shell = parseComposite("""
public class Test extends Shell {
public Test() {
@@ -749,7 +783,7 @@ public Test() {
// add new Composite
CompositeInfo composite;
try {
- composite = (CompositeInfo) BTestUtils.createControl("org.eclipse.swt.widgets.Composite");
+ composite = (CompositeInfo) BTestUtils.createControl(name);
composite.putArbitraryValue(JavaInfo.FLAG_MANUAL_COMPONENT, Boolean.TRUE);
fillLayout.command_CREATE(composite, null);
// execute pending async's
@@ -758,16 +792,7 @@ public Test() {
preferencesRepairer.restore();
}
// check result
- assertEditor("""
- public class Test extends Shell {
- public Test() {
- setLayout(new FillLayout());
- {
- Composite composite = new Composite(this, SWT.NONE);
- composite.setLayout(new GridLayout(1, false));
- }
- }
- }""");
+ assertEditor(source);
assertNotSame(fillLayout, composite.getLayout());
}
@@ -1259,4 +1284,30 @@ public Test(Composite parent, int style) {
assertTrue(m_shouldNotBeSharedShell.isDisposed());
m_shouldNotBeSharedShell = null;
}
+
+ /**
+ * Prepares test.MyComposite class which does not accept new
+ * {@link Layout}.
+ */
+ public static void prepareMyComposite_withFixedLayout() throws Exception {
+ setFileContentSrc("test/MyComposite.java", getSource("""
+ // filler filler filler filler filler
+ // filler filler filler filler filler
+ package test;
+ import org.eclipse.swt.widgets.Composite;
+ public class MyComposite extends Composite {
+ public MyComposite(Composite parent, int style) {
+ super(parent, style);
+ }
+ }"""));
+ setFileContentSrc("test/MyComposite.wbp-component.xml", """
+
+
+
+
+
+
+ """);
+ waitForAutoBuild();
+ }
}
\ No newline at end of file