/*******************************************************************************
 * Copyright (c) 2009, 2016 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
 *     Mike Evans      - Fix for Bug 283136
 *******************************************************************************/

package org.eclipse.ui.intro.contentproviders;

import java.io.PrintWriter;
import java.util.Properties;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IWorkbenchPreferenceConstants;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.internal.intro.impl.Messages;
import org.eclipse.ui.internal.intro.impl.util.ReopenUtil;
import org.eclipse.ui.intro.IIntroSite;
import org.eclipse.ui.intro.config.IIntroAction;
import org.eclipse.ui.intro.config.IIntroContentProvider;
import org.eclipse.ui.intro.config.IIntroContentProviderSite;
import org.eclipse.ui.PlatformUI;
/**
 *
 * Class which contributes a checkbox to an intro page which allows welcome to show
 * on startup. If the checkbox is checked the home page of intro will be shown the next
 * time the Eclipse application starts up. This class may be subclassed to override
 * the text for the checkbox label.
 *
 * Implements the IIntroContentProvider to create the checkbox ui, and the
 * org.eclipse.ui.intro.config.IIntroAction interface for handling checkbox click events.
 *
 * @since 3.3
 */
public class AlwaysWelcomeCheckbox implements IIntroContentProvider,IIntroAction {

	public final static String ALWAYS_SHOW_INTRO = "alwaysShowIntro"; //$NON-NLS-1$

	private boolean disposed = false;

	/**
	 * Override this method to change the default text used for the checkbox
	 *
	 * @return String label for the checkbox
	 *
	 * @since 3.3
	 *
	 */
	protected String getText()
	{
		// Default text
		return Messages.AlwaysWelcomeCheckbox_Text;
	}


	@Override
	public void createContent(String id, PrintWriter out) {

		boolean alwaysShowIntro = getAlwaysShowIntroPref();

		// Use an IIntroAction url that points back to this class -
		// particularly invoking run().
		// This url is 'activated' using the onClick event.
		out.print("<div id=\""+id+"\"><input type=\"checkbox\" "+  	//$NON-NLS-1$//$NON-NLS-2$
				"onClick=window.location="+ 						//$NON-NLS-1$
				"\"http://org.eclipse.ui.intro/runAction?"+ 		//$NON-NLS-1$
				"pluginId=org.eclipse.ui.intro&"+ 					//$NON-NLS-1$
				"class="+this.getClass().getName()+"\" ");			//$NON-NLS-1$ //$NON-NLS-2$

		if (alwaysShowIntro)
		{
			out.print(" checked=\"checked\""); //$NON-NLS-1$

	        PlatformUI.getPreferenceStore().setValue(
	        		IWorkbenchPreferenceConstants.SHOW_INTRO, alwaysShowIntro);
		}

		out.println("/>"+getText()+"</div>");  //$NON-NLS-1$//$NON-NLS-2$
	}


	@Override
	public void createContent(String id, Composite parent, FormToolkit toolkit) {
		if (disposed)
			return;

        boolean alwaysShowIntro = getAlwaysShowIntroPref();

		Button checkBox = new Button(parent,SWT.CHECK);
		toolkit.adapt((Control)checkBox,false,false);

		checkBox.setText(getText());
		checkBox.setSelection(alwaysShowIntro);
		checkBox.addSelectionListener(new SelectionAdapter(){
			@Override
			public void widgetSelected(SelectionEvent e){
				reverseShowIntroState();
			}
		});

		if (alwaysShowIntro)
			PlatformUI.getPreferenceStore().setValue(
        		IWorkbenchPreferenceConstants.SHOW_INTRO, alwaysShowIntro);
	}

	@Override
	public void dispose() {
		disposed = true;
	}

	@Override
	public void init(IIntroContentProviderSite site) {
	}

	/**
	 * Method called when box is clicked in html (swt is handled with a
	 * SelectionAdapter - both methods call reverseShowIntroState())
	 */
	@Override
	public void run(IIntroSite site, Properties params) {
		reverseShowIntroState();
	}

	/**
	 * Method reverses preference ALWAYS_SHOW_INTRO due to checkbox selection change
	 *
	 */
	private void reverseShowIntroState()
	{
		// Retrieve current state of IUniversalIntroConst.ALWAYS_SHOW_INTRO, change it, and save it back
		// to both ALWAYS_SHOW_INTRO and SHOW_INTRO
        boolean alwaysShowIntro = !getAlwaysShowIntroPref();

        // local preference store
        setAlwaysShowIntroPref(alwaysShowIntro);

        // workbench preference store
        PlatformUI.getPreferenceStore().setValue(
        		IWorkbenchPreferenceConstants.SHOW_INTRO, alwaysShowIntro);

	}

	public boolean getAlwaysShowIntroPref()
	{
		// If uninitialized, we will default to true (box will be checked)
		if (!ReopenUtil.isReopenPreferenceInitialized()) {
			setAlwaysShowIntroPref(true);
		}
		return ReopenUtil.isReopenPreference();
	}

	public void setAlwaysShowIntroPref(boolean val)
	{
		ReopenUtil.setReopenPreference(val);
	}
}
