/*******************************************************************************
 * 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 Composite containerGroup;
	static Canvas canvas;
	static Composite composite;
	static Group group;
	static Sash sash;
	
	// Native
	static Composite nativeGroup;
	static Button buttonCheckBox;
	static ToolBar toolBar;
	static CoolBar coolBar;
	static Label label;
	static Link link;
	static Scale scale;
	static Button radio;
	static Button check;
	static Button push;

	// Custom
	static Composite customGroup;
	static CLabel cLabel;
	static StyledText styledText;
	static SashForm sashForm;
	static CTabFolder cTab;
	static CTabFolder gradientCTab;

	// Item
	static Composite itemGroup;
	static TabFolder tabFolder;
	static Table table;
	static Tree tree;
	static ExpandBar expandBar;
	
	// As Designed
	static Composite 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));
					toolBar.setBackground(display.getSystemColor(SWT.COLOR_TRANSPARENT));
					coolBar.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));
					toolBar.setBackground(null);
					coolBar.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(display.getSystemColor(SWT.COLOR_CYAN));
					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(display.getSystemColor(SWT.COLOR_CYAN));
					ccombo.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
					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 Composite(shell, SWT.NONE);
		containerGroup.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		containerGroup.setToolTipText("CONTAINER");
		layout = new RowLayout();
		layout.spacing = 20;
		containerGroup.setLayout(layout);
		
		// Native
		nativeGroup = new Composite(shell, SWT.NONE);
		nativeGroup.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		nativeGroup.setToolTipText("NATIVE");
		layout = new RowLayout();
		layout.spacing = 20;
		nativeGroup.setLayout(layout);
		
		// Custom
		customGroup = new Composite(shell, SWT.NONE);
		customGroup.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		customGroup.setToolTipText("CUSTOM");
		layout = new RowLayout();
		layout.spacing = 20;
		customGroup.setLayout(layout);

		// AsDesigned
		defaultBackgroundGroup = new Composite(shell, SWT.NONE);
		defaultBackgroundGroup.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		defaultBackgroundGroup.setToolTipText("Default Background");
		layout = new RowLayout();
		layout.spacing = 20;
		defaultBackgroundGroup.setLayout(layout);

		// ItemGroup
		itemGroup = new Composite(shell, SWT.NONE);
		itemGroup.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		itemGroup.setToolTipText("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);
		push.setText("Push Button");
		
		// Toolbar
		toolBar = new ToolBar(nativeGroup, SWT.FLAT);
		toolBar.pack();
		ToolItem item = new ToolItem(toolBar, SWT.PUSH);
		item.setText("ToolBar_Item");

		// Coolbar
		coolBar = new CoolBar(nativeGroup, SWT.BORDER);
		for (int i=0; i<2; i++) {
			CoolItem item2 = new CoolItem (coolBar, SWT.NONE);
			Button button = new Button (coolBar, SWT.PUSH);
			button.setText ("Button " + i);
			Point size = button.computeSize (SWT.DEFAULT, SWT.DEFAULT);
			item2.setPreferredSize (item2.computeSize (size.x, size.y));
			item2.setControl (button);
		}
		// 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.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
		list.add("List_one");
		list.add("List_two");
		list.add("List_three");
		list.add("List_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 | SWT.V_SCROLL | SWT.H_SCROLL);
		composite.setToolTipText("Composite");
		
		// TabFolder
		tabFolder = new TabFolder(containerGroup, 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;
	}

}
