/*******************************************************************************
 * Copyright (c) 2000, 2013 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.ant.internal.ui.preferences;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.ant.core.AntCorePlugin;
import org.eclipse.ant.core.AntCorePreferences;
import org.eclipse.ant.core.IAntClasspathEntry;
import org.eclipse.ant.core.Property;
import org.eclipse.ant.core.Task;
import org.eclipse.ant.core.Type;
import org.eclipse.ant.internal.ui.AntUIPlugin;
import org.eclipse.ant.internal.ui.IAntUIHelpContextIds;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;

/**
 * Ant preference page to set the classpath, tasks, types and properties.
 */
public class AntRuntimePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {

	private AntClasspathPage classpathPage;
	private AntTasksPage tasksPage;
	private AntTypesPage typesPage;
	private AntPropertiesPage propertiesPage;

	/**
	 * Creates the preference page
	 */
	public AntRuntimePreferencePage() {
		setDescription(AntPreferencesMessages.AntPreferencePage_description);
		setPreferenceStore(AntUIPlugin.getDefault().getPreferenceStore());
	}

	@Override
	public void init(IWorkbench workbench) {
		// do nothing
	}

	@Override
	protected Control createContents(Composite parent) {
		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IAntUIHelpContextIds.ANT_RUNTIME_PREFERENCE_PAGE);
		initializeDialogUnits(parent);

		TabFolder folder = new TabFolder(parent, SWT.NONE);
		folder.setLayout(new TabFolderLayout());
		folder.setLayoutData(new GridData(GridData.FILL_BOTH));
		folder.setFont(parent.getFont());

		classpathPage = new AntClasspathPage(this);
		classpathPage.createTabItem(folder);

		tasksPage = new AntTasksPage(this);
		tasksPage.createTabItem(folder);

		typesPage = new AntTypesPage(this);
		typesPage.createTabItem(folder);

		propertiesPage = new AntPropertiesPage(this);
		propertiesPage.createTabItem(folder);

		tasksPage.initialize();
		typesPage.initialize();
		classpathPage.initialize();
		propertiesPage.initialize();

		return folder;
	}

	@Override
	protected void performDefaults() {
		super.performDefaults();

		AntCorePreferences prefs = AntCorePlugin.getPlugin().getPreferences();
		tasksPage.setInput(prefs.getDefaultTasks());
		typesPage.setInput(prefs.getDefaultTypes());
		classpathPage.performDefaults();
		propertiesPage.performDefaults();
	}

	@Override
	public boolean performOk() {
		AntCorePreferences prefs = AntCorePlugin.getPlugin().getPreferences();
		IDialogSettings settings = AntUIPlugin.getDefault().getDialogSettings();

		prefs.setAntHomeClasspathEntries(classpathPage.getAntHomeEntries());

		prefs.setAdditionalClasspathEntries(classpathPage.getAdditionalEntries());

		String antHome = classpathPage.getAntHome();
		prefs.setAntHome(antHome);

		List<?> contents = tasksPage.getContents(false);
		if (contents != null) {
			Task[] tasks = contents.toArray(new Task[contents.size()]);
			prefs.setCustomTasks(tasks);
		}

		tasksPage.saveColumnSettings(settings);

		contents = typesPage.getContents(false);
		if (contents != null) {
			Type[] types = contents.toArray(new Type[contents.size()]);
			prefs.setCustomTypes(types);
		}

		typesPage.saveColumnSettings(settings);

		contents = propertiesPage.getProperties();
		if (contents != null) {
			Property[] properties = contents.toArray(new Property[contents.size()]);
			prefs.setCustomProperties(properties);
		}

		String[] files = propertiesPage.getPropertyFiles();
		prefs.setCustomPropertyFiles(files);

		propertiesPage.saveAdditionalSettings();

		prefs.updatePluginPreferences();

		return super.performOk();
	}

	@Override
	protected GridData setButtonLayoutData(Button button) {
		return super.setButtonLayoutData(button);
	}

	protected List<IAntClasspathEntry> getLibraryEntries() {
		List<IAntClasspathEntry> urls = new ArrayList<>();
		urls.addAll(Arrays.asList(classpathPage.getAntHomeEntries()));
		urls.addAll(Arrays.asList(classpathPage.getAdditionalEntries()));
		urls.addAll(Arrays.asList(classpathPage.getContributedEntries()));
		return urls;
	}
}
