/*******************************************************************************
 * Copyright (c) 2001, 2006 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
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/


package org.eclipse.wst.xml.ui.internal.dialogs;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
import org.eclipse.wst.xml.ui.internal.util.XMLCommonUIContextIds;



public class SelectXMLCatalogIdDialog extends Dialog {
	protected String[] extensions;
	protected Button okButton;
	protected SelectXMLCatalogIdPanel panel;
	protected String publicId;
	protected String systemId;

	public SelectXMLCatalogIdDialog(Shell parentShell, String[] extensions) {
		super(parentShell);
		setShellStyle(getShellStyle() | SWT.RESIZE);
		this.extensions = extensions;
	}


	protected void buttonPressed(int buttonId) {
		if (buttonId == IDialogConstants.OK_ID) {
			ISelection selection = panel.getTableViewer().getSelection();
			Object selectedObject = (selection instanceof IStructuredSelection) ? ((IStructuredSelection) selection).getFirstElement() : null;

			if (selectedObject instanceof ICatalogEntry) {
				ICatalogEntry mappingInfo = (ICatalogEntry) selectedObject;
				publicId = mappingInfo.getKey();
				systemId = computeDefaultSystemId(mappingInfo);
			}
		}
		super.buttonPressed(buttonId);
	}

	protected String computeDefaultSystemId(ICatalogEntry mappingInfo) {
		String result = mappingInfo.getAttributeValue(ICatalogEntry.ATTR_WEB_URL);
		if ((result == null) && (mappingInfo.getURI() != null)) {
			int index = mappingInfo.getURI().lastIndexOf("/"); //$NON-NLS-1$
			String lastSegment = index != -1 ? mappingInfo.getURI().substring(index + 1) : mappingInfo.getURI();
			result = lastSegment;
		}
		return result;
	}

	protected void createButtonsForButtonBar(Composite parent) {
		okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
		okButton.setEnabled(false);
		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
	}

	protected Control createDialogArea(Composite parent) {
		Composite dialogArea = (Composite) super.createDialogArea(parent);
		PlatformUI.getWorkbench().getHelpSystem().setHelp(dialogArea, XMLCommonUIContextIds.XCUI_CATALOG_DIALOG);

		ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
		panel = new SelectXMLCatalogIdPanel(dialogArea, xmlCatalog);

		ISelectionChangedListener listener = new ISelectionChangedListener() {
			public void selectionChanged(SelectionChangedEvent event) {
				updateButtonState();
			}
		};
		panel.getTableViewer().setFilterExtensions(extensions);
		panel.getTableViewer().addSelectionChangedListener(listener);
		return dialogArea;
	}



	public String getId() {
		return publicId;
	}

	public String getSystemId() {
		return systemId;
	}

	protected void updateButtonState() {
		ISelection selection = panel.getTableViewer().getSelection();
		okButton.setEnabled(!selection.isEmpty());
	}
}
