/*******************************************************************************
 * Copyright (c) 2015 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.snippets;

import org.eclipse.swt.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

/**
 * Transparent Background example snippet: Set transparent background.
 *
 * For a list of all SWT example snippets see
 * http://www.eclipse.org/swt/snippets/
 */
public class Snippet365 {
	static Image oldImage;
	static Image newImage;
	
	// Containers
	static Group containerGroup;
	static Canvas canvas;
	static Composite composite;
	static Group group;
	static Sash sash;
	
	// Native
	static Group nativeGroup;
	static Button buttonCheckBox;
	static ToolBar bar;
	static Label label;
	static Link link;
	static Scale scale;
	static Button radio;
	static Button check;
	static Button push;

	// Custom
	static Group customGroup;
	static CLabel cLabel;
	static StyledText styledText;
	static SashForm sashForm;
	static CTabFolder cTab;
	static CTabFolder gradientCTab;

	// Item
	static Group itemGroup;
	static TabFolder tabFolder;
	static Table table;
	static Tree tree;
	static ExpandBar expandBar;
	
	// As Designed
	static Group defaultBackgroundGroup;
	static Text text;
	static Combo combo;
	static ProgressBar progressBar;
	static DateTime dateTime;
	static Slider slider;
	static List list;
	static CCombo ccombo;
	
	public static void main(String[] args) {
		final Display display = new Display();
		final Shell shell = new Shell(display);
		shell.setText("Snippet365 - Transparent Background");
		RowLayout layout = new RowLayout(SWT.VERTICAL);
		layout.spacing = 20;
		layout.marginWidth = 10;
		layout.marginHeight = 10;
		shell.setLayout(layout);
		// Standard color background for Shell
		// shell.setBackground(display.getSystemColor(SWT.COLOR_CYAN));

		// Gradient background for Shell
		shell.addListener(SWT.Resize, new Listener() {
			@Override
			public void handleEvent(Event event) {
				Rectangle rect = shell.getClientArea();
				Image newImage = new Image(display, Math.max(1, rect.width), 1);
				GC gc = new GC(newImage);
				gc.setForeground(display.getSystemColor(SWT.COLOR_BLUE));
				gc.setBackground(display.getSystemColor(SWT.COLOR_GREEN));
				gc.fillGradientRectangle(rect.x, rect.y, rect.width, 1, false);
				gc.dispose();
				shell.setBackgroundImage(newImage);
				if (oldImage != null)
					oldImage.dispose();
				oldImage = newImage;
			}
		});

		// Transparent
		buttonCheckBox = new Button(shell, SWT.CHECK | SWT.None);
		buttonCheckBox.setText("SET TRANSPARENT");
		buttonCheckBox.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
		buttonCheckBox.setSelection(false);
		buttonCheckBox.addSelectionListener(new SelectionListener() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				boolean transparent = ((Button) e.getSource()).getSelection();
				if (transparent) {
					// ContainerGroup
					containerGroup.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					canvas.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					composite.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					tabFolder.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					for (TabItem item : tabFolder.getItems()) {
						item.getControl().setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					}
					
					// Native
					nativeGroup.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					bar.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					label.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					link.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					scale.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					radio.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					check.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					group.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					sash.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					slider.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					list.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));

					// Custom
					customGroup.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					cLabel.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					cTab.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_TRANSPARENT));
					gradientCTab.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_TRANSPARENT));
					sashForm.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_TRANSPARENT));
					for (Control control : sashForm.getChildren()) {
						control.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_TRANSPARENT));
					}
					// Default
					push.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					defaultBackgroundGroup.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					combo.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					progressBar.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					dateTime.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					ccombo.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					text.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					styledText.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					expandBar.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					table.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					tree.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					
					// ItemGroup
					itemGroup.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
				} else {
					// Native
					nativeGroup.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
					bar.setBackground(null);
					label.setBackground(null);
					link.setBackground(null);
					scale.setBackground(null);
					RGB rgb = display.getSystemColor(SWT.COLOR_CYAN).getRGB();
					radio.setBackground(new Color(display, new RGBA(rgb.red, rgb.blue, rgb.green, 255)));
					check.setBackgroundImage(getBackgroundImage(display));
					group.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
					sash.setBackground(display.getSystemColor(SWT.COLOR_DARK_CYAN));
					slider.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
					list.setBackground(null);
					text.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
					
					// ContainerGroup
					containerGroup.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
					canvas.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
					composite.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
					tabFolder.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
					for (TabItem item : tabFolder.getItems()) {
						item.getControl().setBackground(display.getSystemColor(SWT.COLOR_CYAN));
					}
					// Custom
					customGroup.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
					cLabel.setBackground((Color) null);
					styledText.setBackground((Color) null);
					sashForm.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
					for (Control control : sashForm.getChildren()) {
						control.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
					}
					cTab.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));

					gradientCTab.setBackground(
							new Color[] { display.getSystemColor(SWT.COLOR_RED),
									display.getSystemColor(SWT.COLOR_WHITE) }, new int[] { 90 }, true);

					// Default
					defaultBackgroundGroup.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
					push.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
					combo.setBackground(null);
					ccombo.setBackground(null);
					dateTime.setBackground(null);
					progressBar.setBackground(null);
					expandBar.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
					table.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
					tree.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
					
					// ItemGroup
					itemGroup.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
				}
			}

			@Override
			public void widgetDefaultSelected(SelectionEvent e) {
			}
		});

		// ContainerGroup
		containerGroup = new Group(shell, SWT.NONE);
		containerGroup.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		containerGroup.setText("CONTAINER");
		layout = new RowLayout();
		layout.spacing = 20;
		containerGroup.setLayout(layout);
		
		// Native
		nativeGroup = new Group(shell, SWT.NONE);
		nativeGroup.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		nativeGroup.setText("NATIVE");
		layout = new RowLayout();
		layout.spacing = 20;
		nativeGroup.setLayout(layout);
		
		// Custom
		customGroup = new Group(shell, SWT.NONE);
		customGroup.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		customGroup.setText("CUSTOM");
		layout = new RowLayout();
		layout.spacing = 20;
		customGroup.setLayout(layout);

		// AsDesigned
		defaultBackgroundGroup = new Group(shell, SWT.NONE);
		defaultBackgroundGroup.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		defaultBackgroundGroup.setText("Default Background");
		layout = new RowLayout();
		layout.spacing = 20;
		defaultBackgroundGroup.setLayout(layout);

		// ItemGroup
		itemGroup = new Group(shell, SWT.NONE);
		itemGroup.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		itemGroup.setText("ITEM");
		layout = new RowLayout();
		layout.spacing = 20;
		itemGroup.setLayout(layout);
		
		// Label
		label = new Label(nativeGroup, SWT.NONE);
		label.setText("Label");
		
		// Radio button
		radio = new Button(nativeGroup, SWT.RADIO);
		radio.setText("Radio Button");
		radio.setSelection(true);
		radio.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
		
		// Checkbox button with image
		check = new Button(nativeGroup, SWT.CHECK);
		check.setText("CheckBox Image");
		check.setSelection(true);
		check.setBackgroundImage(getBackgroundImage(display));

		// Push Button
		push = new Button(defaultBackgroundGroup, SWT.PUSH | SWT.NO_BACKGROUND);
		push.setText("Push Button");
		
		// Toolbar
		bar = new ToolBar(nativeGroup, SWT.FLAT);
		bar.pack();
		ToolItem item = new ToolItem(bar, SWT.PUSH);
		item.setText("ToolBar_Item");

		// Scale
		scale = new Scale(nativeGroup, SWT.None);
		scale.setMaximum(100);
		scale.setSelection(20);
		
		// Link
		link = new Link(nativeGroup, SWT.NONE);
		link.setText("<A>Sample link</A>");

		// List
		list = new List(nativeGroup, SWT.BORDER);
		list.add("one");
		list.add("two");
		list.add("three");
		list.add("four");
		
		// Canvas
		canvas = new Canvas (containerGroup, SWT.NONE);
		canvas.setToolTipText("Canvas");
		canvas.addPaintListener(new PaintListener () {
			@Override
			public void paintControl(PaintEvent e) {
				GC gc = e.gc;
				gc.setForeground(display.getSystemColor(SWT.COLOR_RED));
				gc.drawRectangle(e.x+1, e.y+1, e.width-2, e.height-2);
				gc.drawArc(2, 2, e.width-4, e.height-4, 0, 360);
			}
		});
		
		// Composite
		composite = new Composite(containerGroup, SWT.BORDER);
		composite.setToolTipText("Composite");
		
		// TabFolder
		tabFolder = new TabFolder(itemGroup, SWT.BORDER);
		tabFolder.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
		for (int i=0; i < 2; i++) {
			TabItem tabItem = new TabItem (tabFolder, SWT.NONE);
			tabItem.setText ("TabItem " + i);
			Label label = new Label (tabFolder, SWT.PUSH);
			label.setText ("Page " + i);
			tabItem.setControl (label);
			tabItem.getControl().setBackground(display.getSystemColor(SWT.COLOR_CYAN));
		}
		tabFolder.pack ();
		
		// Group
		group = new Group(containerGroup, SWT.NONE);
		group.setText("Group");

		// Sash
		sash = new Sash(containerGroup, SWT.HORIZONTAL | SWT.BORDER);
		sash.setBackground(display.getSystemColor(SWT.COLOR_DARK_CYAN));
		sash.setLayoutData(new RowData(100, 100));
		sash.setToolTipText("Sash");
		
		// SashForm
		sashForm = new SashForm(containerGroup, SWT.HORIZONTAL | SWT.BORDER);
		Label leftLabel = new Label(sashForm, SWT.NONE);
		leftLabel.setText("SashForm\nLeft\n...\n...\n...\n...\n...");
		Label rightLabel = new Label(sashForm, SWT.NONE);
		rightLabel.setText("SashForm\nRight\n...\n...\n...\n...\n...");

		// DateTime
		dateTime = new DateTime(defaultBackgroundGroup, SWT.NONE);
		dateTime.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
		
		// Text
		text = new Text(nativeGroup, SWT.BORDER);
		text.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
		text.setText("text");
		
		// ProgressBar
		progressBar = new ProgressBar(defaultBackgroundGroup, SWT.NONE);
		progressBar.setMaximum(100);
		progressBar.setSelection(80);
		
		// Combo
		combo = new Combo(defaultBackgroundGroup, SWT.BORDER);
		combo.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
		combo.add("combo");
		combo.setText("combo");
		
		// Slider
		slider = new Slider(nativeGroup, SWT.HORIZONTAL | SWT.BORDER);
		slider.setSelection(20);
		slider.setBackground(display.getSystemColor(SWT.COLOR_CYAN));

		// CCombo
		ccombo = new CCombo(defaultBackgroundGroup, SWT.BORDER);
		ccombo.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
		ccombo.add("ccombo");
		ccombo.setText("ccombo");

		// CLable
		cLabel = new CLabel(customGroup, SWT.NONE);
		cLabel.setText("CLabel");

		// Text
		styledText = new StyledText(customGroup, SWT.BORDER);
		styledText.setFont(new Font(display, "Tahoma", 18, SWT.BOLD | SWT.ITALIC));
		styledText.setForeground(display.getSystemColor(SWT.COLOR_DARK_BLUE));
		styledText.setText("Styled Text");
		styledText.append("\n");
		styledText.append("Example_string");
		styledText.append("\n");
		styledText.append("One_Two");
		styledText.append("\n");
		styledText.append("Two_Three");

		// CTabFolder
		cTab = new CTabFolder(containerGroup, SWT.BORDER);
		for (int i = 0; i < 2; i++) {
			CTabItem cTabItem = new CTabItem(cTab, SWT.CLOSE, i);
			cTabItem.setText("CTabItem " + (i + 1));
		}
		cTab.setSelection(0);

		// Gradient CTabFolder
		gradientCTab = new CTabFolder(customGroup, SWT.BORDER);
		gradientCTab.setBackground(
				new Color[] { display.getSystemColor(SWT.COLOR_WHITE), display.getSystemColor(SWT.COLOR_RED) },
				new int[] { 90 }, true);
		for (int i = 0; i < 2; i++) {
			CTabItem cTabItem = new CTabItem(gradientCTab, SWT.CLOSE, i);
			cTabItem.setText("CTabItem " + (i + 1));
		}
		gradientCTab.setSelection(0);

		// Table
		table = new Table(itemGroup, SWT.V_SCROLL);
		table.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
		table.setLinesVisible(true);
		table.setHeaderVisible(true);
		TableItem tableItem = new TableItem(table, SWT.NONE);
		tableItem.setText("TableItem - One");
		tableItem = new TableItem(table, SWT.NONE);
		tableItem.setText("TableItem - Two");
		
		// Tree
		tree = new Tree(itemGroup, SWT.NONE);
		TreeItem treeItem = new TreeItem (tree, SWT.NONE);
		treeItem.setText("Parent");
		TreeItem childItem = new TreeItem (treeItem, SWT.NONE);
		childItem.setText("Child1");
		childItem = new TreeItem (treeItem, SWT.NONE);
		childItem.setText("Child2");
		treeItem.setExpanded(true);
		tree.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
		
		// ExpandBar
		expandBar = new ExpandBar (itemGroup, SWT.V_SCROLL);
		expandBar.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
		for (int i = 1; i <= 2; i++) {
			ExpandItem item1 = new ExpandItem(expandBar, SWT.NONE, 0);
			item1.setText("Expand_Bar_Entry " + i);
			item1.setExpanded(true);
			item1.setHeight(20);
		}
		
		shell.open();
		shell.pack();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}

	private static Image getBackgroundImage(final Display display) {
		if (newImage == null) {
			Rectangle rect = new Rectangle(0, 0, 115, 5);
			newImage = new Image(display, Math.max(1, rect.width), 1);
			GC gc = new GC(newImage);
			gc.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
			gc.setBackground(display.getSystemColor(SWT.COLOR_RED));
			gc.fillGradientRectangle(rect.x, rect.y, rect.width, 1, false);
			gc.dispose();
		}
		return newImage;
	}

}
