/*******************************************************************************
 * Copyright (c) 2018 Simeon Andreev and others. All rights reserved.
 * The contents of this file are made available under the terms
 * of the GNU Lesser General Public License (LGPL) Version 2.1 that
 * accompanies this distribution (lgpl-v21.txt).  The LGPL is also
 * available at http://www.gnu.org/licenses/lgpl.html.  If the version
 * of the LGPL at http://www.gnu.org is different to the version of
 * the LGPL accompanying this distribution and there is any conflict
 * between the two license versions, the terms of the LGPL accompanying
 * this distribution shall govern.
 *
 * Contributors:
 *     Simeon Andreev - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.tests.gtk.snippets;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 * Description: {@link CTabItem} in {@link CTabFolder} are not drawn if {@link CTabFolder} is placed
 * below some other widget and is using {@link SWT#RIGHT_TO_LEFT}.
 * Steps to reproduce:
 * <ol>
 * <li>Run the snippet.</li>
 * <li>Observe tabs of tab folder.</li>
 * </ol>
 * Expected results: The tabs of the tab folders are seen.
 * Actual results: The tabs of the tab folders are not seen.
 */
public class Bug531667_CTabFolder_right_to_left_tabs_are_not_painted_nested {

	public static void main(String[] args) {
		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setSize(400, 300);
		shell.setLayout(new FillLayout(SWT.VERTICAL));
		shell.setText("Bug 531667: tab painting is broken");

		Composite c = new Composite(shell, SWT.NONE);
		c.setBackground(display.getSystemColor(SWT.COLOR_CYAN));

		Composite c1 = new Composite(shell, SWT.NONE);
		c1.setLayout(new FillLayout(SWT.HORIZONTAL));
		Composite c2 = new Composite(shell, SWT.NONE);
		c2.setLayout(new FillLayout(SWT.HORIZONTAL));

		Composite c3 = new Composite(c1, SWT.NONE);
		c3.setLayout(new FillLayout());
		Composite c4 = new Composite(c1, SWT.NONE);
		c4.setLayout(new FillLayout());
		Composite c5 = new Composite(c2, SWT.NONE);
		c5.setLayout(new FillLayout());
		Composite c6 = new Composite(c2, SWT.NONE);
		c6.setLayout(new FillLayout());

		Composite[] co = { c4, c3, c5, c6  };
		for (int i = 0; i  < co.length; ++i) {
			Composite comp = co[i];
			int alignmentStyle = i % 2 == 0 ? SWT.LEFT_TO_RIGHT : SWT.RIGHT_TO_LEFT;
			CTabFolder tabFolder = new CTabFolder(comp, alignmentStyle);
			createTab(tabFolder, "Tab 1", SWT.COLOR_GREEN);
			createTab(tabFolder, "Tab 2", SWT.COLOR_YELLOW);
		}

		shell.open();

		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
		display.dispose();
	}

	private static CTabItem createTab(CTabFolder parent, String text, int color) {
		CTabItem tab1 = new CTabItem(parent, SWT.NONE);
		tab1.setText(text);
		Composite comp = new Composite(parent, SWT.NONE);
		comp.setBackground(comp.getDisplay().getSystemColor(color));
		tab1.setControl(comp);
		return tab1;
	}

}
