/*******************************************************************************
 * Copyright (c) 2006, 2016 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.swt.examples.graphics;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.Region;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;

/**
 * This tab demonstrates how to apply a region clipping and the effects of
 * applying one.
 */
public class RegionClippingTab extends GraphicsTab {

	private Combo clippingCb;
	private Button colorButton1, colorButton2;
	private Menu menu1, menu2;
	private GraphicsBackground colorGB1, colorGB2;

public RegionClippingTab(GraphicsExample example) {
	super(example);
}

@Override
public String getCategory() {
	return GraphicsExample.getResourceString("Clipping"); //$NON-NLS-1$
}

@Override
public String getText() {
	return GraphicsExample.getResourceString("RegionClipping"); //$NON-NLS-1$
}

@Override
public String getDescription() {
	return GraphicsExample.getResourceString("RegionClippingDescription"); //$NON-NLS-1$
}

@Override
public void dispose() {
	if (menu1 != null) {
		menu1.dispose();
		menu1 = null;
	}
	if (menu2 != null) {
		menu2.dispose();
		menu2 = null;
	}
}

/**
 * Creates the widgets used to control the drawing.
 */
@Override
public void createControlPanel(Composite parent) {
	// create drop down combo for choosing clipping
	Composite comp = new Composite(parent, SWT.NONE);
	comp.setLayout(new GridLayout(2, false));

	new Label(comp, SWT.CENTER).setText(GraphicsExample
			.getResourceString("Clipping")); //$NON-NLS-1$
	clippingCb = new Combo(comp, SWT.DROP_DOWN);
	clippingCb.add(GraphicsExample.getResourceString("Region1")); //$NON-NLS-1$
	clippingCb.add(GraphicsExample.getResourceString("Region2")); //$NON-NLS-1$
	clippingCb.add(GraphicsExample.getResourceString("Add")); //$NON-NLS-1$
	clippingCb.add(GraphicsExample.getResourceString("Sub")); //$NON-NLS-1$
	clippingCb.add(GraphicsExample.getResourceString("Inter")); //$NON-NLS-1$
	clippingCb.select(0);
	clippingCb.addListener(SWT.Selection, event -> example.redraw());

	// color menu
	ColorMenu cm = new ColorMenu();
	menu1 = cm.createMenu(parent.getParent(), gb -> {
		colorGB1 = gb;
		colorButton1.setImage(gb.getThumbNail());
		example.redraw();
	});
	menu2 = cm.createMenu(parent.getParent(), gb -> {
		colorGB2 = gb;
		colorButton2.setImage(gb.getThumbNail());
		example.redraw();
	});

	// initialize the color to blue
	colorGB1 = (GraphicsBackground)menu1.getItem(4).getData();
	// initialize the color to red
	colorGB2 = (GraphicsBackground)menu2.getItem(2).getData();

	// color button 1
	comp = new Composite(parent, SWT.NONE);
	comp.setLayout(new GridLayout(2, false));

	colorButton1 = new Button(comp, SWT.PUSH);
	colorButton1.setText(GraphicsExample
			.getResourceString("Color1")); //$NON-NLS-1$
	colorButton1.setImage(colorGB1.getThumbNail());
	colorButton1.addListener(SWT.Selection, event -> {
		final Button button = (Button) event.widget;
		final Composite parent1 = button.getParent();
		Rectangle bounds = button.getBounds();
		Point point = parent1.toDisplay(new Point(bounds.x, bounds.y));
		menu1.setLocation(point.x, point.y + bounds.height);
		menu1.setVisible(true);
	});

	// color button 2
	comp = new Composite(parent, SWT.NONE);
	comp.setLayout(new GridLayout(2, false));

	colorButton2 = new Button(comp, SWT.PUSH);
	colorButton2.setText(GraphicsExample
			.getResourceString("Color2")); //$NON-NLS-1$
	colorButton2.setImage(colorGB2.getThumbNail());
	colorButton2.addListener(SWT.Selection, event -> {
		final Button button = (Button) event.widget;
		final Composite parent1 = button.getParent();
		Rectangle bounds = button.getBounds();
		Point point = parent1.toDisplay(new Point(bounds.x, bounds.y));
		menu2.setLocation(point.x, point.y + bounds.height);
		menu2.setVisible(true);
	});
}

@Override
public void paint(GC gc, int width, int height) {
	if (!example.checkAdvancedGraphics()) return;
	Device device = gc.getDevice();

	// array of coordinate points of polygon 1 (region 1)
	int [] polygon1 = new int [] {10, height/2, 9*width/16, 10, 9*width/16, height-10};
	Region region1 = new Region(device);
	region1.add(polygon1);

	// array of coordinate points of polygon 2 (region 2)
	int [] polygon2 = new int [] {
			9*width/16, 10,
			9*width/16, height/8,
			7*width/16, 2*height/8,
			9*width/16, 3*height/8,
			7*width/16, 4*height/8,
			9*width/16, 5*height/8,
			7*width/16, 6*height/8,
			9*width/16, 7*height/8,
			9*width/16, height-10,
			width-10, height/2
	};
	Region region2 = new Region(device);
	region2.add(polygon2);

	gc.setAlpha(127);

	int clippingIndex = clippingCb.getSelectionIndex();

	switch (clippingIndex) {
	case 0:
		// region 1
		gc.setClipping(region1);
		gc.setBackground(colorGB1.getBgColor1());
		gc.fillPolygon(polygon1);
		break;
	case 1:
		// region 2
		gc.setClipping(region2);
		gc.setBackground(colorGB2.getBgColor1());
		gc.fillPolygon(polygon2);
		break;
	case 2:
		// add
		region1.add(region2);
		break;
	case 3:
		// sub
		region1.subtract(region2);
		break;
	case 4:
		// intersect
		region1.intersect(region2);
		break;
	}

	if (clippingIndex > 1) {
		gc.setClipping(region1);

		gc.setBackground(colorGB1.getBgColor1());
		gc.fillPolygon(polygon1);

		gc.setBackground(colorGB2.getBgColor1());
	    gc.fillPolygon(polygon2);
	}

	region1.dispose();
	region2.dispose();
    }
}
