/*******************************************************************************
 * Copyright (c) 2018 Red Hat 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:
 *     Red Hat - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.tests.gtk.snippets;


import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

public class Bug205199_LabelSetImageNull
{
	public static void main(String[] args)
	{
		new Bug205199_LabelSetImageNull();
	}

	private Image image;
	private Label label;
	private int state=0;

	public Bug205199_LabelSetImageNull()
	{
		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setLayout( new FillLayout());

		// Create an graphics.image
		this.image = new Image (display, 16, 16);
		Color color = display.getSystemColor (SWT.COLOR_RED);
		GC gc = new GC (image);
		gc.setBackground (color);
		gc.fillRectangle (image.getBounds());
		gc.dispose ();

		this.label = new Label(shell,SWT.NONE);
		Button button = new Button(shell,SWT.PUSH);
		button.setText("click Me");
		button.addSelectionListener(
			new SelectionAdapter()
			{
				@Override
				public void widgetSelected(SelectionEvent e)
				{
					if (state == 0)
					{
						label.setImage(image);
						label.setText("1. widget.text");
					}
					else if (state == 1)
					{
						label.setText("2. widget.text");
						label.setImage(image);
					}
					else if (state == 2)
					{
						label.setText("3. widget.text");
						label.setImage(null);
					}
					state++;
				}
			}
		);

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