/*******************************************************************************
 * Copyright (c) 2006, 2011 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * 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.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.core.runtime.Assert;

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

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.ui.refactoring.RefactoringUI;
import org.eclipse.ltk.ui.refactoring.history.ISortableRefactoringHistoryControl;
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.
 *
 * @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 ISortableRefactoringHistoryControl 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);
		fSettings= settings;
		fData= data;
		fHistory= history;
	}

	/*
	 * @see org.eclipse.jface.dialogs.Dialog#isResizable()
	 * @since 3.4
	 */
	@Override
	protected boolean isResizable() {
		return true;
	}

	@Override
	protected void buttonPressed(final int buttonId) {
		if (buttonId == IDialogConstants.OK_ID) {
			fData.setRefactoringAware(true);
			final RefactoringDescriptorProxy[] descriptors= fHistoryControl.getCheckedDescriptors();
			Set<IProject> set= new HashSet<>();
			IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
			for (RefactoringDescriptorProxy descriptor : descriptors) {
				final String project= descriptor.getProject();
				if (project != null && !"".equals(project)) //$NON-NLS-1$
					set.add(root.getProject(project));
			}
			fData.setRefactoringProjects(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);
	}

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

	@Override
	public void create() {
		super.create();
		getButton(OK).setEnabled(!fHistory.isEmpty());
	}

	@Override
	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) {

			@Override
			public final String getWorkspaceCaption() {
				return JarPackagerMessages.JarRefactoringDialog_workspace_caption;
			}
		};
		fHistoryControl= (ISortableRefactoringHistoryControl) RefactoringUI.createSortableRefactoringHistoryControl(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.getControl().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;
	}
}