/*******************************************************************************
 * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is 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:
 *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
 ******************************************************************************/ 
package org.jboss.tools.common.model.ui.dialog;

import java.util.*;
import org.eclipse.swt.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.jface.dialogs.*;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.Assert;

import org.jboss.tools.common.model.ServiceDialog;

public class MessageAndCheckboxDialog extends MessageDialog {
	public static String MESSAGE = ServiceDialog.DIALOG_MESSAGE;
	public static String CHECKBOX_MESSAGE = ServiceDialog.CHECKBOX_MESSAGE;
	public static String CHECKED = ServiceDialog.CHECKED;
	public static String BUTTONS = ServiceDialog.BUTTONS;
	public static String SEPARATOR = ServiceDialog.SEPARATOR;
	public static String TITLE = "title"; //$NON-NLS-1$
	public static String RETURN_CODE = ServiceDialog.RETURN_CODE;
	Button button;
	Button[] buttons = new Button[0];
	Properties properties;
	int lastButton = -1;
	
	public MessageAndCheckboxDialog(Shell parentShell, String dialogTitle, int dialogImageType, Properties p) {
		super(parentShell, dialogTitle, null, p.getProperty(MESSAGE), dialogImageType, createButtonLabels(p), 0);
		properties = p;
	}
	
	static String[] createButtonLabels(Properties p) {
		String[] buttons = (String[])p.get(BUTTONS);
		if(buttons == null) return new String[]{IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL};
		String[] bs = new String[buttons.length];
		for (int i = 0; i < bs.length; i++) {
			bs[i] = JFaceResources.getString(buttons[i]);
			if(bs[i] == null) bs[i] = buttons[i];
		}
		return bs;
	}

	public static boolean openConfirm(Shell parent, Properties p) {
		Assert.isNotNull(p);
		Assert.isNotNull(p.getProperty(MESSAGE), "Property " + MESSAGE + " is null"); //$NON-NLS-1$ //$NON-NLS-2$
		Assert.isNotNull(p.getProperty(CHECKBOX_MESSAGE), "Property " + CHECKBOX_MESSAGE + " is null"); //$NON-NLS-1$ //$NON-NLS-2$
		Assert.isTrue(p.get(CHECKED) instanceof Boolean, "Property " + CHECKED + " must have type Boolean"); //$NON-NLS-1$ //$NON-NLS-2$
		String title = p.getProperty("title", "Confirmation"); //$NON-NLS-1$
		MessageAndCheckboxDialog dialog = new MessageAndCheckboxDialog(parent, title, QUESTION, p);
		int result = dialog.open();
		p.put(RETURN_CODE, Integer.valueOf(result));
		return result == 0;
	}
	
	protected Control createCustomArea(Composite parent) {
		String b1 = properties.getProperty(CHECKBOX_MESSAGE + "_1"); //$NON-NLS-1$
		if(b1 == null) return button = createCheckBox(parent, ""); //$NON-NLS-1$
		return createMultiCheckBox(parent);
	}
	
	protected Button createCheckBox(Composite parent, String suffix) {
		Button b = new Button(parent, SWT.CHECK);
		GridData data = new GridData(GridData.FILL_HORIZONTAL);
		if(getImage() != null)
			data.horizontalIndent = getImage().getImageData().width + 8;
		b.setLayoutData(data);
		b.setText(properties.getProperty(CHECKBOX_MESSAGE + suffix));
		b.setSelection(((Boolean)properties.get(CHECKED + suffix)).booleanValue());		
		return b;
	}

	protected Control createMultiCheckBox(Composite parent) {
		Composite c = new Composite(parent, SWT.NONE);
		c.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		GridLayout l = new GridLayout();
		l.marginWidth = 0;
		l.marginHeight = 11;
		c.setLayout(l);
		button = createCheckBox(c, ""); //$NON-NLS-1$
		ArrayList<Button> list = new ArrayList<Button>();
		int i = 1;
		while(true) {
			String suffix = "_" + i; //$NON-NLS-1$
			if(properties.getProperty(CHECKBOX_MESSAGE + suffix) == null) break;
			if(properties.getProperty(SEPARATOR + suffix) != null) {
				// actually here we should only call
				// createSeparator(parent, true);
				// breaking would be performed 
				// on another property LAST + suffix
				// it is not implemented while we have 
				// the only case for this dialog.
				lastButton = i;
				break;
			}
			Button b = createCheckBox(c, suffix);
			list.add(b);
			++i;
		}
		buttons = list.toArray(new Button[0]);
		return c;
	}
	
	private void createSeparator(Composite parent, boolean indent) {
		Label lb = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
		GridData data = new GridData(GridData.FILL_HORIZONTAL);
		if(indent && getImage() != null)
			data.horizontalIndent = getImage().getImageData().width + 8;
		lb.setLayoutData(data);
	}
	
	private void createSpace(Composite parent, int height) {
		Label lb = new Label(parent, SWT.HORIZONTAL);
		GridData data = new GridData(GridData.FILL_HORIZONTAL);
		data.heightHint = height;
		lb.setLayoutData(data);
	}
	
	protected void buttonPressed(int buttonId) {
		properties.put(CHECKED, Boolean.valueOf(button.getSelection()));
		for (int i = 0; i < buttons.length; i++) {
			properties.put(CHECKED + "_" + (i + 1), Boolean.valueOf(buttons[i].getSelection())); //$NON-NLS-1$
		}
		super.buttonPressed(buttonId);
	}
	
	protected Control createButtonBar(Composite parent) {
		if(lastButton < 0) return super.createButtonBar(parent);
		Composite vcomposite = new Composite(parent, SWT.NONE);
		GridLayout vl = new GridLayout(1, false);
		vl.marginHeight = 0;
		vl.marginWidth = 0;
		vl.verticalSpacing = 0;
		vcomposite.setLayout(vl);
		GridData d = new GridData(GridData.FILL_HORIZONTAL);
		d.horizontalSpan = 2;
		vcomposite.setLayoutData(d);
///		createSpace(vcomposite, 6);
		createSeparator(vcomposite, false);
		createSpace(vcomposite, 10);
		Composite composite = new Composite(vcomposite, SWT.NONE);
		GridLayout l = new GridLayout(2, false);
		l.marginHeight = 0;
		l.marginWidth = 0;
		l.verticalSpacing = 0;
		composite.setLayout(l);
		GridData data = new GridData(GridData.VERTICAL_ALIGN_CENTER | GridData.FILL_HORIZONTAL);
		composite.setLayoutData(data);
		Button b = createCheckBox(composite, "_" + lastButton); //$NON-NLS-1$
		b.setLayoutData(new GridData());
		Button[] bs = new Button[buttons.length + 1];
		System.arraycopy(buttons, 0, bs, 0, buttons.length);
		bs[buttons.length] = b;
		buttons = bs;
		Composite w = new Composite(composite, SWT.NONE); 
		GridLayout wl = new GridLayout(2, false);
		wl.marginHeight = 0;
		wl.marginWidth = 0;
		wl.horizontalSpacing = 0;
		wl.verticalSpacing = 0;
		w.setLayout(wl);
		w.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		Control c = super.createButtonBar(w);
		c.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.FILL_HORIZONTAL));
		return vcomposite;
	}

}
