/*******************************************************************************
 * Copyright (c) 2007 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.team.internal.ccvs.ui;

import java.util.Map;
import java.util.Properties;

import org.eclipse.jface.dialogs.*;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.team.internal.ccvs.core.ICVSRepositoryLocation;
import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation;
import org.eclipse.team.internal.ccvs.ui.wizards.AlternativeLocationWizard;
import org.eclipse.ui.PlatformUI;

public class ConfigureRepositoryLocationsDialog extends TitleAreaDialog {

	private Image dlgTitleImage;
	private ConfigureRepositoryLocationsTable fConfigureRepositoryLocationsTable;

	/**
	 * Creates a new AlternativeRepositoryDialog.
	 * 
	 * @param parentShell
	 *            the parent shell
	 * @param alternativesMap
	 *            Map with a repository location (ICVSRepositoryLocation) from
	 *            the Team Project Set as a key and list of alternatives found
	 *            (also ICVSRepositoryLocation) as a value.
	 * @param message
	 *            a message to display to the user
	 */
	public ConfigureRepositoryLocationsDialog(Shell parentShell, Map alternativesMap) {
		super(parentShell);
		setShellStyle(getShellStyle() | SWT.RESIZE);
		fConfigureRepositoryLocationsTable = new ConfigureRepositoryLocationsTable(
				alternativesMap);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.dialogs.TitleAreaDialog#createContents(org.eclipse.swt.widgets.Composite)
	 */
	protected Control createContents(Composite parent) {
		Control contents = super.createContents(parent);
		setTitle(CVSUIMessages.ConfigureRepositoryLocationsWizard_title);
		setMessage(CVSUIMessages.ConfigureRepositoryLocationsWizard_message);
		dlgTitleImage = CVSUIPlugin.getPlugin().getImageDescriptor(
				ICVSUIConstants.IMG_WIZBAN_NEW_LOCATION).createImage();
		setTitleImage(dlgTitleImage);
		return contents;
	}

	public boolean close() {
		if (dlgTitleImage != null) {
			dlgTitleImage.dispose();
		}
		return super.close();
	}

	/*
	 * (non-Javadoc) Method declared in Window.
	 */
	protected void configureShell(Shell shell) {
		super.configureShell(shell);
		shell.setText(CVSUIMessages.ConfigureRepositoryLocationsWizard_title);
		// set F1 help
		PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
				IHelpContextIds.ALTERNATIVE_REPOSITORY_DIALOG);
	}

	/**
	 * @see Dialog#createDialogArea
	 */
	protected Control createDialogArea(Composite parent) {
		initializeDialogUnits(parent);

		final Composite composite = new Composite(parent, SWT.NONE);
		composite.setLayout(new GridLayout(2, false));

		GridData childData = new GridData(GridData.FILL_BOTH);
		composite.setLayoutData(childData);

		Composite table = fConfigureRepositoryLocationsTable.createControl(composite);
		GridData gridData = new GridData(GridData.VERTICAL_ALIGN_FILL);
		gridData.horizontalSpan = 2;
		gridData.horizontalAlignment = GridData.FILL;
		gridData.grabExcessHorizontalSpace = true;
		gridData.grabExcessVerticalSpace = true;
		table.setLayoutData(gridData);
		
		final Button showOnlyCompatibleLocationsButton = new Button(composite,
				SWT.CHECK);
		showOnlyCompatibleLocationsButton
				.setText(CVSUIMessages.ConfigureRepositoryLocationsWizard_showOnlyCompatible);
		showOnlyCompatibleLocationsButton.setSelection(true);
		showOnlyCompatibleLocationsButton.addListener(SWT.Selection,
				new Listener() {
					public void handleEvent(Event event) {
						fConfigureRepositoryLocationsTable
								.setShowOnlyCompatibleLocations(showOnlyCompatibleLocationsButton
										.getSelection());
					}
				});
		showOnlyCompatibleLocationsButton.setLayoutData(new GridData(
				SWT.BEGINNING, SWT.NONE, false, false));
		
		final Button createLocationButton = new Button(composite, SWT.PUSH);
		createLocationButton
				.setText(CVSUIMessages.ConfigureRepositoryLocationsWizard_createLocation);
		createLocationButton
				.setToolTipText(CVSUIMessages.ConfigureRepositoryLocationsWizard_createLocationTooltip);
		createLocationButton.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {

				CVSRepositoryLocation selectedAlternativeRepository = fConfigureRepositoryLocationsTable
						.getSelectedAlternativeRepository();

				Properties properties = new Properties();
				properties
						.put(
								"connection", selectedAlternativeRepository.getMethod().getName()); //$NON-NLS-1$
				properties.put(
						"user", selectedAlternativeRepository.getUsername()); //$NON-NLS-1$
				// TODO: retrieve password (if available) and use it to prime
				// the field
				// properties.put("password", ""); //$NON-NLS-1$
				properties.put("host", selectedAlternativeRepository.getHost()); //$NON-NLS-1$
				int port = selectedAlternativeRepository.getPort();
				if (port != ICVSRepositoryLocation.USE_DEFAULT_PORT)
					properties.put("port", String.valueOf(port)); //$NON-NLS-1$
				properties
						.put(
								"root", selectedAlternativeRepository.getRootDirectory()); //$NON-NLS-1$

				AlternativeLocationWizard wizard = new AlternativeLocationWizard(
						properties);
				wizard.setSwitchPerspectives(false);
				WizardDialog dialog = new ConfigureRepositoryLocationsWizardDialog(
						getShell(), wizard);
				dialog.open();

				ICVSRepositoryLocation location = wizard.getLocation();
				if (location != null)
					fConfigureRepositoryLocationsTable
							.addAlternativeRepository(location);
			}
		});
		createLocationButton.setEnabled(fConfigureRepositoryLocationsTable
				.getSelection().getFirstElement() != null);
		createLocationButton.setLayoutData(new GridData(SWT.END, SWT.NONE,
				false, false));
		
		fConfigureRepositoryLocationsTable.getViewer().addSelectionChangedListener(
				new ISelectionChangedListener() {
					public void selectionChanged(SelectionChangedEvent event) {
						IStructuredSelection sel = (IStructuredSelection) event
								.getSelection();
						Object firstElement = sel.getFirstElement();
						createLocationButton.setEnabled(firstElement != null);
					}
				});

		return composite;
	}

	public Map getSelected() {
		return fConfigureRepositoryLocationsTable.getSelected();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings()
	 */
	protected IDialogSettings getDialogBoundsSettings() {
		String sectionName = getClass().getName() + "_dialogBounds"; //$NON-NLS-1$
		IDialogSettings settings = CVSUIPlugin.getPlugin().getDialogSettings();
		IDialogSettings section = settings.getSection(sectionName);
		if (section == null) {
			section = settings.addNewSection(sectionName);
			section.put("DIALOG_HEIGHT", 300); //$NON-NLS-1$
			section.put("DIALOG_WIDTH", 600); //$NON-NLS-1$
		}
		return section;
	}

	/*
	 * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsStrategy()
	 * @since 3.2
	 */
	protected int getDialogBoundsStrategy() {
		return DIALOG_PERSISTLOCATION | DIALOG_PERSISTSIZE;
	}
	
	/**
	 * This class is made only to change Wizard's default "Finish" button label
	 * to "Create".
	 */
	private class ConfigureRepositoryLocationsWizardDialog extends WizardDialog {

		public ConfigureRepositoryLocationsWizardDialog(Shell parentShell,
				IWizard newWizard) {
			super(parentShell, newWizard);
		}

		protected Button createButton(Composite parent, int id, String label,
				boolean defaultButton) {
			if (id == IDialogConstants.FINISH_ID)
				label = CVSUIMessages.ConfigureRepositoryLocationsWizardDialog_finish;
			return super.createButton(parent, id, label, defaultButton);
		}

	}
}
