/*******************************************************************************
 * Copyright (c) 2008 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.equinox.internal.provisional.p2.ui.policy;

import java.net.URI;
import org.eclipse.equinox.internal.p2.ui.DefaultMetadataURLValidator;
import org.eclipse.equinox.internal.p2.ui.ProvUIMessages;
import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException;
import org.eclipse.equinox.internal.provisional.p2.ui.dialogs.RepositoryManipulationPage;
import org.eclipse.equinox.internal.provisional.p2.ui.operations.*;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PreferencesUtil;

/**
 * Provides a repository manipulator that interprets URLs as colocated
 * artifact and metadata repositories.  If a preference id has been
 * set, the manipulator will open a pref page to manipulate sites.  If it has
 * not been set, then a dialog will be opened.
 * 
 * @since 3.5
 */

public class ColocatedRepositoryManipulator extends RepositoryManipulator {

	Policy policy;
	String prefPageId = null;

	public ColocatedRepositoryManipulator(Policy policy, String prefPageId) {
		this.policy = policy;
		this.prefPageId = prefPageId;
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.equinox.internal.provisional.p2.ui.policy.RepositoryManipulator#getManipulatorButtonLabel()
	 */
	public String getManipulatorButtonLabel() {
		return ProvUIMessages.ColocatedRepositoryManipulator_ManageSites;

	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.equinox.internal.provisional.p2.ui.policy.RepositoryManipulator#manipulateRepositories(org.eclipse.swt.widgets.Shell)
	 */
	public boolean manipulateRepositories(Shell shell) {
		if (prefPageId != null) {
			PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(shell, prefPageId, null, null);
			dialog.open();
		} else {
			TitleAreaDialog dialog = new TitleAreaDialog(shell) {
				RepositoryManipulationPage page;

				protected Control createDialogArea(Composite parent) {
					page = new RepositoryManipulationPage();
					page.setPolicy(policy);
					page.init(PlatformUI.getWorkbench());
					page.createControl(parent);
					this.setTitle(ProvUIMessages.RepositoryManipulationPage_Title);
					this.setMessage(ProvUIMessages.RepositoryManipulationPage_Description);
					return page.getControl();
				}

				protected void okPressed() {
					if (page.performOk())
						super.okPressed();
				}

				protected void cancelPressed() {
					if (page.performCancel())
						super.cancelPressed();
				}
			};
			dialog.open();
		}
		return true;
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.equinox.internal.provisional.p2.ui.policy.RepositoryManipulator#getAddOperation(java.net.URI)
	 */
	public AddRepositoryOperation getAddOperation(URI repoLocation) {
		return new AddColocatedRepositoryOperation(getAddOperationLabel(), repoLocation);
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.equinox.internal.provisional.p2.ui.policy.RepositoryManipulator#getAddOperationLabel()
	 */
	public String getAddOperationLabel() {
		return ProvUIMessages.ColocatedRepositoryManipulator_AddSiteOperationLabel;
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.equinox.internal.provisional.p2.ui.policy.RepositoryManipulator#getKnownRepositories()
	 */
	public URI[] getKnownRepositories() {
		try {
			return ProvisioningUtil.getMetadataRepositories(policy.getQueryContext().getMetadataRepositoryFlags());
		} catch (ProvisionException e) {
			return new URI[0];
		}
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.equinox.internal.provisional.p2.ui.policy.RepositoryManipulator#getRemoveOperation(java.net.URI[])
	 */
	public RemoveRepositoryOperation getRemoveOperation(URI[] reposToRemove) {
		return new RemoveColocatedRepositoryOperation(getRemoveOperationLabel(), reposToRemove);
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.equinox.internal.provisional.p2.ui.policy.RepositoryManipulator#getRemoveOperationLabel()
	 */
	public String getRemoveOperationLabel() {
		return ProvUIMessages.ColocatedRepositoryManipulator_RemoveSiteOperationLabel;
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.equinox.internal.provisional.p2.ui.policy.RepositoryManipulator#getURLValidator(org.eclipse.swt.widgets.Shell)
	 */
	public RepositoryLocationValidator getRepositoryLocationValidator(Shell shell) {
		DefaultMetadataURLValidator validator = new DefaultMetadataURLValidator();
		validator.setKnownRepositoriesFlag(policy.getQueryContext().getMetadataRepositoryFlags());
		return validator;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.equinox.internal.provisional.p2.ui.policy.RepositoryManipulator#getManipulatorLinkLabel()
	 */
	public String getManipulatorLinkLabel() {
		return ProvUIMessages.ColocatedRepositoryManipulator_GotoPrefs;

	}

	/* (non-Javadoc)
	 * @see org.eclipse.equinox.internal.provisional.p2.ui.policy.RepositoryManipulator#getSiteNotFoundCorrectionString()
	 */
	public String getRepositoryNotFoundInstructionString() {
		return ProvUIMessages.ColocatedRepositoryManipulator_SiteNotFoundDescription;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.equinox.internal.provisional.p2.ui.policy.RepositoryManipulator#getManipulatorInstructionString()
	 */
	public String getManipulatorInstructionString() {
		return ProvUIMessages.ColocatedRepositoryManipulator_NoContentExplanation;
	}

}
