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