/*******************************************************************************
 * Copyright (c) 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.jdt.internal.ui.jarpackager;

import java.util.HashSet;
import java.util.Set;

import org.eclipse.core.runtime.Assert;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;

import org.eclipse.swt.SWT;
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.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.TrayDialog;

import org.eclipse.ui.PlatformUI;

import org.eclipse.ltk.core.refactoring.RefactoringDescriptorProxy;
import org.eclipse.ltk.core.refactoring.history.RefactoringHistory;
import org.eclipse.ltk.internal.ui.refactoring.history.BrowseRefactoringHistoryControl;
import org.eclipse.ltk.ui.refactoring.history.RefactoringHistoryControlConfiguration;

import org.eclipse.jdt.ui.jarpackager.JarPackageData;

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

/**
 * Dialog to configure the refactorings to export.
 * 
 * TODO: introduce API in LTK UI to create a browse refactoring history control.
 * 
 * @since 3.2
 */
public final class JarRefactoringDialog extends TrayDialog {

	/** The sort dialog setting */
	private static final String SETTING_SORT= "org.eclipse.jdt.ui.jar.export.sortRefactorings"; //$NON-NLS-1$

	/** The jar package data */
	private final JarPackageData fData;

	/** The export structural button */
	private Button fExportStructural= null;

	/** The refactoring history */
	private final RefactoringHistory fHistory;

	/** The refactoring history control */
	private BrowseRefactoringHistoryControl fHistoryControl= null;

	/** The dialog settings */
	private final IDialogSettings fSettings;

	/**
	 * Creates a new jar refactoring dialog.
	 * 
	 * @param shell
	 *            the parent shell
	 * @param settings
	 *            the dialog settings, or <code>null</code>
	 * @param data
	 *            the jar package data
	 * @param history
	 *            the refactoring history
	 */
	public JarRefactoringDialog(final Shell shell, final IDialogSettings settings, final JarPackageData data, final RefactoringHistory history) {
		super(shell);
		Assert.isNotNull(data);
		Assert.isNotNull(history);
		setShellStyle(getShellStyle() | SWT.RESIZE);
		fSettings= settings;
		fData= data;
		fHistory= history;
	}

	/**
	 * {@inheritDoc}
	 */
	protected void buttonPressed(final int buttonId) {
		if (buttonId == IDialogConstants.OK_ID) {
			fData.setRefactoringAware(true);
			final RefactoringDescriptorProxy[] descriptors= fHistoryControl.getCheckedDescriptors();
			Set set= new HashSet();
			IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
			for (int index= 0; index < descriptors.length; index++) {
				final String project= descriptors[index].getProject();
				if (project != null && !"".equals(project)) //$NON-NLS-1$
					set.add(root.getProject(project));
			}
			fData.setRefactoringProjects((IProject[]) set.toArray(new IProject[set.size()]));
			fData.setRefactoringDescriptors(descriptors);
			fData.setExportStructuralOnly(fExportStructural.getSelection());
			final IDialogSettings settings= fSettings;
			if (settings != null)
				settings.put(SETTING_SORT, fHistoryControl.isSortByProjects());
		}
		super.buttonPressed(buttonId);
	}

	/**
	 * {@inheritDoc}
	 */
	protected void configureShell(final Shell shell) {
		super.configureShell(shell);
		shell.setText(JarPackagerMessages.JarRefactoringDialog_dialog_title);
		PlatformUI.getWorkbench().getHelpSystem().setHelp(shell, IJavaHelpContextIds.JARPACKAGER_REFACTORING_DIALOG);
	}

	/**
	 * {@inheritDoc}
	 */
	protected Control createDialogArea(final Composite parent) {
		final Composite container= (Composite) super.createDialogArea(parent);
		initializeDialogUnits(container);
		final Composite composite= new Composite(container, SWT.NULL);
		final GridLayout layout= new GridLayout();
		layout.marginHeight= 0;
		layout.marginWidth= 0;
		composite.setLayout(layout);
		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL));
		final RefactoringHistoryControlConfiguration configuration= new RefactoringHistoryControlConfiguration(null, true, true) {

			public final String getWorkspaceCaption() {
				return JarPackagerMessages.JarRefactoringDialog_workspace_caption;
			}
		};
		fHistoryControl= new BrowseRefactoringHistoryControl(composite, configuration);
		fHistoryControl.createControl();
		boolean sortProjects= true;
		final IDialogSettings settings= fSettings;
		if (settings != null)
			sortProjects= settings.getBoolean(SETTING_SORT);
		if (sortProjects)
			fHistoryControl.sortByProjects();
		else
			fHistoryControl.sortByDate();
		GridData data= new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
		data.heightHint= convertHeightInCharsToPixels(32);
		data.widthHint= convertWidthInCharsToPixels(72);
		fHistoryControl.setLayoutData(data);
		fHistoryControl.setInput(fHistory);
		fHistoryControl.setCheckedDescriptors(fData.getRefactoringDescriptors());
		createPlainLabel(composite, JarPackagerMessages.JarPackageWizardPage_options_label);
		createOptionsGroup(composite);
		Dialog.applyDialogFont(parent);
		return composite;
	}

	/**
	 * Create the export option group.
	 * 
	 * @param parent
	 *            the parent composite
	 */
	protected void createOptionsGroup(Composite parent) {
		Composite optionsGroup= new Composite(parent, SWT.NONE);
		GridLayout layout= new GridLayout();
		layout.marginHeight= 0;
		optionsGroup.setLayout(layout);

		fExportStructural= new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
		fExportStructural.setText(JarPackagerMessages.JarRefactoringDialog_export_structural);
		fExportStructural.setSelection(fData.isExportStructuralOnly());
	}

	/**
	 * Creates a new label.
	 * 
	 * @param parent
	 *            the parent control
	 * @param text
	 *            the label text
	 * @return the new label control
	 */
	protected Label createPlainLabel(Composite parent, String text) {
		Label label= new Label(parent, SWT.NONE);
		label.setText(text);
		label.setFont(parent.getFont());
		GridData data= new GridData();
		data.verticalAlignment= GridData.FILL;
		data.horizontalAlignment= GridData.FILL;
		label.setLayoutData(data);
		return label;
	}
}