/*******************************************************************************
 * Copyright (c) 2000, 2011 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.jdt.internal.ui.refactoring;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;

import org.eclipse.ltk.core.refactoring.Refactoring;

import org.eclipse.jdt.internal.corext.refactoring.tagging.IDelegateUpdating;

import org.eclipse.jdt.internal.ui.JavaPlugin;

/**
 * This is a helper class to keep a consistent design between refactorings
 * capable of creating delegates.
 *
 * @since 3.2
 *
 */
public class DelegateUIHelper {

	public static Button generateDeprecateDelegateCheckbox(Composite parent, Refactoring refactoring) {
		final IDelegateUpdating updating= (IDelegateUpdating) refactoring.getAdapter(IDelegateUpdating.class);
		if (updating == null || !updating.canEnableDelegateUpdating())
			return null;
		final Button button= createCheckbox(parent, getDeprecateDelegateCheckBoxTitle(), loadDeprecateDelegateSetting(updating));
		updating.setDeprecateDelegates(button.getSelection());
		button.addSelectionListener(new SelectionAdapter() {

			@Override
			public void widgetSelected(SelectionEvent e) {
				updating.setDeprecateDelegates(button.getSelection());
			}
		});
		return button;
	}

	public static Button generateLeaveDelegateCheckbox(Composite parent, Refactoring refactoring, boolean plural) {
		final IDelegateUpdating updating= (IDelegateUpdating) refactoring.getAdapter(IDelegateUpdating.class);
		if (updating == null || !updating.canEnableDelegateUpdating())
			return null;
		final Button button= createCheckbox(parent, updating.getDelegateUpdatingTitle(plural), loadLeaveDelegateSetting(updating));
		updating.setDelegateUpdating(button.getSelection());
		button.addSelectionListener(new SelectionAdapter() {

			@Override
			public void widgetSelected(SelectionEvent e) {
				updating.setDelegateUpdating(button.getSelection());
			}
		});
		return button;
	}

	public static void saveLeaveDelegateSetting(Button button) {
		saveBooleanSetting(DELEGATE_UPDATING, button);
	}

	public static void saveDeprecateDelegateSetting(Button button) {
		saveBooleanSetting(DELEGATE_DEPRECATION, button);
	}

	public static boolean loadLeaveDelegateSetting(IDelegateUpdating refactoring) {
		return getBooleanSetting(DELEGATE_UPDATING, refactoring.getDelegateUpdating());
	}

	public static boolean loadDeprecateDelegateSetting(IDelegateUpdating refactoring) {
		return getBooleanSetting(DELEGATE_DEPRECATION, refactoring.getDeprecateDelegates());
	}

	public static String getDeprecateDelegateCheckBoxTitle() {
		return RefactoringMessages.DelegateCreator_deprecate_delegates;
	}

	// ************** Helper methods *******************

	/**
	 * Dialog settings key (value is of type boolean).
	 */
	public static final String DELEGATE_UPDATING= "delegateUpdating"; //$NON-NLS-1$

	/**
	 * Dialog settings key (value is of type boolean).
	 */
	public static final String DELEGATE_DEPRECATION= "delegateDeprecation"; //$NON-NLS-1$

	private DelegateUIHelper() {
		// no instances
	}

	private static Button createCheckbox(Composite parent, String title, boolean value) {
		Button checkBox= new Button(parent, SWT.CHECK);
		checkBox.setText(title);
		checkBox.setSelection(value);
		return checkBox;
	}

	private static boolean getBooleanSetting(String key, boolean defaultValue) {
		String update= JavaPlugin.getDefault().getDialogSettings().get(key);
		if (update != null)
			return Boolean.valueOf(update).booleanValue();
		else
			return defaultValue;
	}

	private static void saveBooleanSetting(String key, Button button) {
		if (button != null && !button.isDisposed() && button.getEnabled())
			JavaPlugin.getDefault().getDialogSettings().put(key, button.getSelection());
	}
}
