/*******************************************************************************
 * Copyright (c) 2001, 2006 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.wst.wsdl.ui.internal.dialogs;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.wst.wsdl.ui.internal.Messages;
import org.eclipse.wst.wsdl.ui.internal.WSDLEditorPlugin;

public class GenerateBindingOnSaveDialog extends MessageDialog implements SelectionListener {
	private static String dialogTitle = Messages.getString("_UI_REGEN_BINDINDS_ON_SAVE");		// TODO: Translations needed.... //$NON-NLS-1$
	private static String dialogMessage = Messages.getString("_UI_REGEN_BINDINGS_ON_SAVE_QUESTIONMARK"); //$NON-NLS-1$
	private static String[] buttons = new String[]{Messages.getString("_UI_YES_LABEL"), Messages.getString("_UI_NO_LABEL"), Messages.getString("_UI_CANCEL_LABEL")}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	
	private Button rememberDecisionBox;
	private boolean rememberDecision = false;
	
	public GenerateBindingOnSaveDialog(Shell shell) {
		super(shell, dialogTitle, null, dialogMessage, MessageDialog.QUESTION, buttons, 0);
	}
	
	
	protected Control createCustomArea(Composite parent) {
		Composite comp = new Composite(parent, SWT.NONE);
		GridLayout layout = new GridLayout();
		layout.numColumns = 2;
		comp.setLayout(layout);
		comp.setData(new GridData());
		
		// Spacer
		new Label(comp, SWT.NONE);
		new Label(comp, SWT.NONE);
		
		rememberDecisionBox = new Button(comp, SWT.CHECK);
		rememberDecisionBox.setText(Messages.getString("_UI_REMEMBER_MY_DECISION_LABEL"));	// TODO: Externalize... //$NON-NLS-1$
		rememberDecisionBox.addSelectionListener(this);

		return parent;
	}
	
	private void storePromptPreference(int swtValue) {
		// Store the new preference for displaying this dialog.
		if (rememberDecision) {
			WSDLEditorPlugin.getInstance().getPluginPreferences().setValue(Messages.getString("_UI_PREF_PAGE_PROMPT_REGEN_BINDING_ON_SAVE"), false); //$NON-NLS-1$
		
			String generateID = Messages.getString("_UI_PREF_PAGE_AUTO_REGENERATE_BINDING"); //$NON-NLS-1$
			if (swtValue == SWT.YES) {
				WSDLEditorPlugin.getInstance().getPluginPreferences().setValue(generateID, true);
			}
			else if (swtValue == SWT.NO) {
				WSDLEditorPlugin.getInstance().getPluginPreferences().setValue(generateID, false);
			}
		}
	}
	
	public int open() {
		int rValue = super.open();
		
		if (rValue ==0) {
			storePromptPreference(SWT.YES);
			return SWT.YES;
		}
		else if (rValue == 1) {
			storePromptPreference(SWT.NO);
			return SWT.NO;
		}
		else if (rValue == 2) {
			storePromptPreference(SWT.CANCEL);
			return SWT.CANCEL;
		}
		
		return rValue;
	}
	
	public void widgetSelected(SelectionEvent e) {
		if (e.widget == rememberDecisionBox) {
			rememberDecision = rememberDecisionBox.getSelection();
		}
	}
	
	public void widgetDefaultSelected(SelectionEvent e) {}
}
