/*******************************************************************************
 * Copyright (c) 2007, 2016 Red Hat Inc. 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:
 *     Red Hat Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.internal.autotools.ui.properties;

import org.eclipse.cdt.core.settings.model.ICResourceDescription;
import org.eclipse.cdt.internal.autotools.core.AutotoolsPropertyConstants;
import org.eclipse.cdt.internal.autotools.ui.AbstractAutotoolsCPropertyTab;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;

public class AutotoolsToolsPropertyTab extends AbstractAutotoolsCPropertyTab {

	public static final String DEFAULT_ACLOCAL = "aclocal"; //$NON-NLS-1$
	public static final String DEFAULT_AUTOMAKE = "automake"; //$NON-NLS-1$
	public static final String DEFAULT_AUTOCONF = "autoconf"; //$NON-NLS-1$
	public static final String DEFAULT_AUTOHEADER = "autoheader"; //$NON-NLS-1$
	public static final String DEFAULT_AUTORECONF = "autoreconf"; //$NON-NLS-1$
	public static final String DEFAULT_LIBTOOLIZE = "libtoolize"; //$NON-NLS-1$

	protected Text fAclocalPath;
	protected Text fAutomakePath;
	protected Text fAutoconfPath;
	protected Text fAutoheaderPath;
	protected Text fAutoreconfPath;
	protected Text fLibtoolizePath;
	private IProject project;

	private IProject getProject() {
		return page.getProject();
	}

	@Override
	public boolean canBeVisible() {
		return true;
	}

	@Override
	public void createControls(Composite parent) {
		super.createControls(parent);
		Composite composite = usercomp;

		// assume parent page uses griddata
		GridData gd = new GridData(
				GridData.HORIZONTAL_ALIGN_CENTER | GridData.VERTICAL_ALIGN_FILL | GridData.FILL_HORIZONTAL);
		composite.setLayoutData(gd);
		GridLayout layout = new GridLayout();
		layout.numColumns = 2;
		//PixelConverter pc= new PixelConverter(composite);
		//layout.verticalSpacing= pc.convertHeightInCharsToPixels(1) / 2;
		composite.setLayout(layout);

		project = getProject();

		Label label = new Label(composite, SWT.LEFT);
		label.setText(AutotoolsPropertyMessages.getString("Autotools.aclocalPath")); //$NON-NLS-1$
		gd = new GridData();
		gd.horizontalAlignment = GridData.BEGINNING;
		label.setLayoutData(gd);

		/* text window for aclocal path */
		fAclocalPath = new Text(composite, SWT.BORDER | SWT.SINGLE);
		fAclocalPath.setToolTipText(AutotoolsPropertyMessages.getString("Autotools.aclocalPath.tooltip")); //$NON-NLS-1$
		gd = new GridData(
				GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
		fAclocalPath.setLayoutData(gd);

		Label label2 = new Label(composite, SWT.LEFT);
		label2.setText(AutotoolsPropertyMessages.getString("Autotools.automakePath")); //$NON-NLS-1$
		gd = new GridData();
		gd.horizontalAlignment = GridData.BEGINNING;
		label2.setLayoutData(gd);

		/* text window for automake path */
		fAutomakePath = new Text(composite, SWT.BORDER | SWT.SINGLE);
		fAutomakePath.setToolTipText(AutotoolsPropertyMessages.getString("Autotools.automakePath.tooltip")); //$NON-NLS-1#
		gd = new GridData(
				GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
		fAutomakePath.setLayoutData(gd);

		Label label3 = new Label(composite, SWT.LEFT);
		label3.setText(AutotoolsPropertyMessages.getString("Autotools.autoconfPath")); //$NON-NLS-1$
		gd = new GridData();
		gd.horizontalAlignment = GridData.BEGINNING;
		label3.setLayoutData(gd);

		/* text window for autoconf path */
		fAutoconfPath = new Text(composite, SWT.BORDER | SWT.SINGLE);
		fAutoconfPath.setToolTipText(AutotoolsPropertyMessages.getString("Autotools.autoconfPath.tooltip")); //$NON-NLS-1$
		gd = new GridData(
				GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
		fAutoconfPath.setLayoutData(gd);

		Label label4 = new Label(composite, SWT.LEFT);
		label4.setText(AutotoolsPropertyMessages.getString("Autotools.autoheaderPath")); //$NON-NLS-1$
		gd = new GridData();
		gd.horizontalAlignment = GridData.BEGINNING;
		label4.setLayoutData(gd);

		/* text window for autoheader path */
		fAutoheaderPath = new Text(composite, SWT.BORDER | SWT.SINGLE);
		fAutoheaderPath.setToolTipText(AutotoolsPropertyMessages.getString("Autotools.autoheaderPath.tooltip")); //$NON-NLS-1$
		gd = new GridData(
				GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
		fAutoheaderPath.setLayoutData(gd);

		Label label5 = new Label(composite, SWT.LEFT);
		label5.setText(AutotoolsPropertyMessages.getString("Autotools.autoreconfPath")); //$NON-NLS-1$
		gd = new GridData();
		gd.horizontalAlignment = GridData.BEGINNING;
		label5.setLayoutData(gd);

		/* text window for autoreconf path */
		fAutoreconfPath = new Text(composite, SWT.BORDER | SWT.SINGLE);
		fAutoreconfPath.setToolTipText(AutotoolsPropertyMessages.getString("Autotools.autoreconfPath.tooltip")); //$NON-NLS-1$
		gd = new GridData(
				GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
		fAutoreconfPath.setLayoutData(gd);

		Label label6 = new Label(composite, SWT.LEFT);
		label6.setText(AutotoolsPropertyMessages.getString("Autotools.libtoolizePath")); //$NON-NLS-1$
		gd = new GridData();
		gd.horizontalAlignment = GridData.BEGINNING;
		label6.setLayoutData(gd);

		/* text window for libtoolize path */
		fLibtoolizePath = new Text(composite, SWT.BORDER | SWT.SINGLE);
		fLibtoolizePath.setToolTipText(AutotoolsPropertyMessages.getString("Autotools.libtoolizePath.tooltip")); //$NON-NLS-1$
		gd = new GridData(
				GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
		fLibtoolizePath.setLayoutData(gd);

		initialize();
	}

	@Override
	public void performOK() {
		String aclocalPath = null;
		String automakePath = null;
		String autoconfPath = null;
		String autoheaderPath = null;
		String autoreconfPath = null;
		String libtoolizePath = null;
		try {
			aclocalPath = project.getPersistentProperty(AutotoolsPropertyConstants.ACLOCAL_TOOL);
		} catch (CoreException e1) {
			aclocalPath = DEFAULT_ACLOCAL;
		}

		String newAclocalPath = fAclocalPath.getText().trim();
		if (aclocalPath == null || !newAclocalPath.equals(aclocalPath)) {
			try {
				project.setPersistentProperty(AutotoolsPropertyConstants.ACLOCAL_TOOL, newAclocalPath);
			} catch (CoreException e1) {
				// Not much we can do at this point
			}
		}

		try {
			automakePath = project.getPersistentProperty(AutotoolsPropertyConstants.AUTOMAKE_TOOL);
		} catch (CoreException e1) {
			automakePath = DEFAULT_AUTOMAKE;
		}

		String newAutomakePath = fAutomakePath.getText().trim();
		if (automakePath == null || !newAutomakePath.equals(automakePath)) {
			try {
				project.setPersistentProperty(AutotoolsPropertyConstants.AUTOMAKE_TOOL, newAutomakePath);
			} catch (CoreException e2) {
				// Not much we can do at this point
			}
		}

		try {
			autoconfPath = project.getPersistentProperty(AutotoolsPropertyConstants.AUTOCONF_TOOL);
		} catch (CoreException e1) {
			autoconfPath = DEFAULT_AUTOCONF;
		}

		String newAutoconfPath = fAutoconfPath.getText().trim();
		if (autoconfPath == null || !newAutoconfPath.equals(autoconfPath)) {
			try {
				project.setPersistentProperty(AutotoolsPropertyConstants.AUTOCONF_TOOL, newAutoconfPath);
			} catch (CoreException e2) {
				// Not much we can do at this point
			}
		}

		try {
			autoheaderPath = project.getPersistentProperty(AutotoolsPropertyConstants.AUTOHEADER_TOOL);
		} catch (CoreException e1) {
			autoheaderPath = DEFAULT_AUTOHEADER;
		}

		String newAutoheaderPath = fAutoheaderPath.getText().trim();
		if (autoheaderPath == null || !newAutoheaderPath.equals(autoheaderPath)) {
			try {
				project.setPersistentProperty(AutotoolsPropertyConstants.AUTOHEADER_TOOL, newAutoheaderPath);
			} catch (CoreException e2) {
				// Not much we can do at this point
			}
		}

		try {
			autoreconfPath = project.getPersistentProperty(AutotoolsPropertyConstants.AUTORECONF_TOOL);
		} catch (CoreException e1) {
			autoreconfPath = DEFAULT_AUTORECONF;
		}

		String newAutoreconfPath = fAutoreconfPath.getText().trim();
		if (autoreconfPath == null || !newAutoreconfPath.equals(autoreconfPath)) {
			try {
				project.setPersistentProperty(AutotoolsPropertyConstants.AUTORECONF_TOOL, newAutoreconfPath);
			} catch (CoreException e2) {
				// Not much we can do at this point
			}
		}

		try {
			libtoolizePath = project.getPersistentProperty(AutotoolsPropertyConstants.LIBTOOLIZE_TOOL);
		} catch (CoreException e1) {
			libtoolizePath = DEFAULT_LIBTOOLIZE;
		}

		String newLibtoolizePath = fLibtoolizePath.getText().trim();
		if (libtoolizePath == null || !newLibtoolizePath.equals(libtoolizePath)) {
			try {
				project.setPersistentProperty(AutotoolsPropertyConstants.LIBTOOLIZE_TOOL, newLibtoolizePath);
			} catch (CoreException e2) {
				// Not much we can do at this point
			}
		}
	}

	@Override
	protected void performApply(ICResourceDescription src, ICResourceDescription dst) {
		performOK();
	}

	@Override
	public void performDefaults() {
		// For default tool settings, simply default the base tool names
		fAclocalPath.setText(DEFAULT_ACLOCAL);
		fAutomakePath.setText(DEFAULT_AUTOMAKE);
		fAutoconfPath.setText(DEFAULT_AUTOCONF);
		fAutoheaderPath.setText(DEFAULT_AUTOHEADER);
		fAutoreconfPath.setText(DEFAULT_AUTORECONF);
		fLibtoolizePath.setText(DEFAULT_LIBTOOLIZE);
	}

	@Override
	public void updateData(ICResourceDescription cfgd) {
		// Nothing to do
	}

	@Override
	public void updateButtons() {
		// Nothing to do
	}

	private void initialize() {
		String aclocalPath = null;
		String automakePath = null;
		String autoconfPath = null;
		String autoheaderPath = null;
		String autoreconfPath = null;
		String libtoolizePath = null;

		try {
			aclocalPath = project.getPersistentProperty(AutotoolsPropertyConstants.ACLOCAL_TOOL);
		} catch (CoreException e1) {
			// do nothing
		}

		if (aclocalPath == null)
			aclocalPath = DEFAULT_ACLOCAL;

		fAclocalPath.setText(aclocalPath);

		try {
			automakePath = project.getPersistentProperty(AutotoolsPropertyConstants.AUTOMAKE_TOOL);
		} catch (CoreException e1) {
			// do nothing
		}

		if (automakePath == null)
			automakePath = DEFAULT_AUTOMAKE;

		fAutomakePath.setText(automakePath);

		try {
			autoconfPath = project.getPersistentProperty(AutotoolsPropertyConstants.AUTOCONF_TOOL);
		} catch (CoreException e1) {
			// do nothing
		}

		if (autoconfPath == null)
			autoconfPath = DEFAULT_AUTOCONF;

		fAutoconfPath.setText(autoconfPath);

		try {
			autoheaderPath = project.getPersistentProperty(AutotoolsPropertyConstants.AUTOHEADER_TOOL);
		} catch (CoreException e1) {
			// do nothing
		}

		if (autoheaderPath == null)
			autoheaderPath = DEFAULT_AUTOHEADER;

		fAutoheaderPath.setText(autoheaderPath);

		try {
			autoreconfPath = project.getPersistentProperty(AutotoolsPropertyConstants.AUTORECONF_TOOL);
		} catch (CoreException e1) {
			// do nothing
		}

		if (autoreconfPath == null)
			autoreconfPath = DEFAULT_AUTORECONF;

		fAutoreconfPath.setText(autoreconfPath);

		try {
			libtoolizePath = project.getPersistentProperty(AutotoolsPropertyConstants.LIBTOOLIZE_TOOL);
		} catch (CoreException e1) {
			// do nothing
		}

		if (libtoolizePath == null)
			libtoolizePath = DEFAULT_LIBTOOLIZE;

		fLibtoolizePath.setText(libtoolizePath);
	}

}
