package org.eclipse.swt.tests.gtk.snippets;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

/*
 * Title: Bug 290650 - [Layout] If a composite with a FillLayout (with marginWidth != 0)
 * contains a widget which could expand depending on a fixed width or height, than computeSize()
 * doesn't calculate the expanding size correctly.
 * How to run: launch snippet and observe size of Text widgets
 * Bug description: One widget is only one line in height when it should be two
 * Expected results: Both widgets should be 2 lines in height
 * GTK Version(s): GTK2.x, GTK3.x
 */
public class Bug290650_FillLayoutComputeSize {
   private static int margin = 100;
   private static String msg = "This is a message with 2 lines and some text";

   private static void init(Shell shell) {
      Composite container1 = new Composite(shell, SWT.NONE);
      FillLayout fillLayout1 = new FillLayout();
      fillLayout1.marginWidth = margin;
      container1.setLayout(fillLayout1);
      container1.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));

      Text text1 = new Text(container1, SWT.WRAP);
      text1.setText(msg);

      Point containerSize1 = container1.computeSize(shell.getClientArea().width, SWT.DEFAULT);
      container1.setSize(containerSize1);

      Composite container2 = new Composite(shell, SWT.NONE);
      container2.setLocation(margin, 50);
      FillLayout fillLayout2 = new FillLayout();
      container2.setLayout(fillLayout2);
      container2.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));

      Text text2 = new Text(container2, SWT.WRAP);
      text2.setText(msg);

      Point containerSize2 = container2.computeSize(shell.getClientArea().width-2*margin, SWT.DEFAULT);
      container2.setSize(containerSize2);

   }

   public static void main(String[] args) {
      final Display display = new Display();
      Shell shell = new Shell(display);
      shell.setText("Fill Layout with Text-Widget Test");
      shell.setSize(190 + 2 * margin, 400);
      init(shell);
      shell.open();
      while (!shell.isDisposed()) {
         if (!display.readAndDispatch())
            display.sleep();
      }
      display.dispose();
   }

}
