/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.update.internal.ui.views;

import java.io.*;

import org.eclipse.core.runtime.*;
import org.eclipse.jface.action.*;
import org.eclipse.jface.dialogs.*;
import org.eclipse.jface.resource.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.update.configuration.*;
import org.eclipse.update.core.*;
import org.eclipse.update.internal.ui.*;
import org.eclipse.update.operations.*;

public class NewExtensionLocationAction extends Action {

	public NewExtensionLocationAction(String text, ImageDescriptor desc) {
		super(text, desc);
	}

	public void run() {
		
		IStatus status = OperationsManager.getValidator().validatePlatformConfigValid();
		if (status != null) {
			ErrorDialog.openError(
					UpdateUI.getActiveWorkbenchShell(),
					null,
					null,
					status);
			return;
		}
		
		DirectoryDialog dialog =
			new DirectoryDialog(UpdateUI.getActiveWorkbenchShell());
		dialog.setMessage(UpdateUI.getString("NewExtensionLocationAction.selectExtLocation")); //$NON-NLS-1$

		String dir = dialog.open();
		while (dir != null) {
			File dirFile = getExtensionSite(new File(dir));
			if (dirFile != null) {
				if (addExtensionLocation(dirFile))
					return;
				else {
					// re-open the directory dialog
					dialog.setFilterPath(dir);
					dir = dialog.open();
				}	
			} else {
				MessageDialog.openInformation(
					UpdateUI.getActiveWorkbenchShell(),
					UpdateUI.getString(
						"NewExtensionLocationAction.extInfoTitle"), //$NON-NLS-1$
					UpdateUI.getString(
						"NewExtensionLocationAction.extInfoMessage")); //$NON-NLS-1$
				// re-open the directory dialog
				dialog.setFilterPath(dir);
				dir = dialog.open();
			}
		}
	}

	/**
	 * @param directory
	 * @return the site file (including "eclipse" path) when directory is an eclipse exstension, null otherwise
	 */
	static File getExtensionSite(File directory) {
		// Check the eclipse folder
		if (directory.getName().equals("eclipse")) { //$NON-NLS-1$
			// if we picked up the eclipse directory, check if its parent is a site
			File site = getExtensionSite(directory.getParentFile());
			if (site != null)
				return directory;
			// otherwise, fall through
		}
		
		File eclipse = new File(directory, "eclipse"); //$NON-NLS-1$
		if (!eclipse.exists() || !eclipse.isDirectory())
			return null;

		// check the marker
		File marker = new File(eclipse, ".eclipseextension"); //$NON-NLS-1$
		if (!marker.exists() || marker.isDirectory())
			return null;
		return eclipse;
	}

	private boolean addExtensionLocation(File dir) {
		try {
			IInstallConfiguration config = SiteManager.getLocalSite().getCurrentConfiguration();
			IConfiguredSite csite = config.createLinkedConfiguredSite(dir);
			config.addConfiguredSite(csite);
			boolean restartNeeded = SiteManager.getLocalSite().save();
			UpdateUI.requestRestart(restartNeeded);
			return true;
		} catch (CoreException e) {
			String title = UpdateUI.getString("InstallWizard.TargetPage.location.error.title"); //$NON-NLS-1$
			ErrorDialog.openError(UpdateUI.getActiveWorkbenchShell(), title, null, e.getStatus());
			UpdateUI.logException(e,false);
			return false;
		}
	}

}
