//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.authoring.ui.dialogs;

import java.io.File;
import java.util.ArrayList;

import org.eclipse.core.runtime.Platform;
import org.eclipse.epf.authoring.ui.AuthoringUIResources;
import org.eclipse.epf.authoring.ui.AuthoringUIText;
import org.eclipse.epf.authoring.ui.filters.AddLinkFilter;
import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
import org.eclipse.epf.common.utils.NetUtil;
import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.library.edit.IFilter;
import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
import org.eclipse.epf.library.ui.LibraryUIResources;
import org.eclipse.epf.library.util.ResourceHelper;
import org.eclipse.epf.richtext.RichTextEditor;
import org.eclipse.epf.richtext.dialogs.AddLinkDialog;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodPlugin;
import org.eclipse.epf.uma.Milestone;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;

/**
 * Prompts the user to select a link type that will be used to create a HTML <a>
 * tag in the Rich Text Editor.
 * 
 * @author Jeff Hardy
 * @author Kelvin Low
 * @since 1.0
 */
public class MethodAddLinkDialog extends AddLinkDialog {

	private static final int LINK_URL = 0;

	private static final int LINK_FILE = LINK_URL + 1;

	// private static final int LINK_ELEMENT_LINK = LINK_URL + 2;

	private static final int LINK_ELEMENT_LINK_WITH_TYPE = LINK_URL + 3;

	private static final int LINK_ELEMENT_LINK_WITH_USER_TEXT = LINK_URL + 4;

	private static final String[] ELEMENT_TYPE_LABELS = {
			LibraryUIResources.linkToURL_name,
			LibraryUIResources.linkToFile_name,
			LibraryUIResources.elementLink_name,
			LibraryUIResources.elementLinkWithType_name,
			LibraryUIResources.elementLinkWithUserText_name };

	public static final String OPEN_LINK_IN_NEW_WINDOW_ATTRIBUTE = "target=\"_blank\""; //$NON-NLS-1$

	private IMethodRichText richText;

	private MethodElement methodElement;
	
	private String elementLoc;

	private Combo linkTypeCombo;

	private Button browseButton;

	private Button openLinkCheckbox;

	private int linkType;

	private boolean openLinkInNewWindow = true;

	private File fileToCopy;
	
	private ModifyListener modifyListener = new ModifyListener() {
		public void modifyText(ModifyEvent event) {
			if (okButton != null) {
				try {
					if (linkType == LINK_FILE && event.widget == urlText) {
						File urlFile = new File(urlText.getText().trim());
						if (urlFile.isAbsolute()) {
							fileToCopy = urlFile;
						} else {
							fileToCopy = new File(elementLoc, urlText.getText().trim());
						}
						okButton.setEnabled(fileToCopy.isFile() && fileToCopy.canRead());
					} else {
						okButton.setEnabled(urlText.getText().trim().length() > 0);
					}
				} catch (Exception e) {
					okButton.setEnabled(false);
				}
			}
		}
	};


	/**
	 * Creates a new instance.
	 * 
	 * @param parent
	 *            The parent shell.
	 * @param richText
	 *            A rich text control.
	 */
	public MethodAddLinkDialog(Shell parent, IMethodRichText richText) {
		super(parent, richText.getBasePath());
		this.richText = richText;
		this.methodElement = richText.getMethodElement();
		elementLoc = ResourceHelper.getFolderAbsolutePath(methodElement);
	}

	/**
	 * @see org.eclipse.epf.richtext.dialogs.BaseDialog#createDialogArea(Composite
	 *      parent)
	 */
	protected Control createDialogArea(Composite parent) {
		Composite composite = (Composite) super.createDialogArea(parent);
		GridLayout layout = (GridLayout) composite.getLayout();
		layout.numColumns = 3;

		Label linkTypeLabel = new Label(composite, SWT.NONE);
		linkTypeLabel.setText(AuthoringUIResources.addLinkDialog_linkType);
		linkTypeLabel.moveAbove(urlLabel);
		
		urlText.removeModifyListener(urlTextModifyListener);
		urlText.addModifyListener(modifyListener);


		linkTypeCombo = new Combo(composite, SWT.BORDER | SWT.READ_ONLY);
		GridData comboGridData = new GridData(GridData.FILL_HORIZONTAL);
		comboGridData.horizontalSpan = 2;
		linkTypeCombo.setLayoutData(comboGridData);
		linkTypeCombo.setItems(ELEMENT_TYPE_LABELS);
		linkTypeCombo.setText(ELEMENT_TYPE_LABELS[0]);
		linkTypeCombo.addSelectionListener(new SelectionListener() {
			public void widgetSelected(SelectionEvent event) {
				linkType = linkTypeCombo.getSelectionIndex();
				browseButton.setEnabled(linkType != LINK_URL);
				urlDisplayNameLabel.setEnabled(linkType == LINK_URL);
				urlDisplayNameText.setEnabled(linkType == LINK_URL);
				if (linkType == LINK_URL) {
					urlDisplayNameText
							.setText(richText.getSelected().getText());
				} else {
					urlDisplayNameText.setText(""); //$NON-NLS-1$
				}
				openLinkCheckbox.setEnabled(linkType == LINK_URL
						|| linkType == LINK_FILE);
				urlText.setText(""); //$NON-NLS-1$
				if (linkType != LINK_FILE) {
					fileToCopy = null;
				}
			}

			public void widgetDefaultSelected(SelectionEvent event) {
			}
		});
		linkTypeCombo.moveAbove(urlLabel);

		browseButton = new Button(composite, SWT.PUSH);
		browseButton.setLayoutData(new GridData());
		browseButton.setText(AuthoringUIText.BROWSE_BUTTON_TEXT);
		browseButton.setEnabled(false);
		browseButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent event) {
				if (linkType == LINK_FILE) {
					FileDialog dialog = new FileDialog(Display.getCurrent()
							.getActiveShell(), SWT.OPEN);
					dialog.setFilterPath(basePath);
					String attachFile = dialog.open();
					if (attachFile != null && attachFile.length() > 0) {
						try {
							File file = new File(dialog.getFilterPath(), dialog
									.getFileName());
							urlText.setText(file.getAbsolutePath());
						} catch (Exception e) {
							logger.logError(e);
						}
					}
				}
				// MethodElement link
				else {
					IFilter filter = new AddLinkFilter() {
						protected boolean childAccept(Object obj) {
							if (obj instanceof MethodPlugin)
								return true;
							if (obj instanceof MethodConfiguration)
								return false;
							if(obj instanceof Milestone) return false;
							return true;
						}
					};
					ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
							.getWorkbench().getActiveWorkbenchWindow()
							.getShell(), filter, methodElement,
							FilterConstants.ALL_ELEMENTS);
					fd.setBlockOnOpen(true);
					fd.setTitle(FilterConstants.ALL_ELEMENTS);
					fd.open();
					ArrayList sel = fd.getSelectedItems();
					if (sel.size() > 0) {
						MethodElement selectedElement = (MethodElement) sel
								.get(0);
						String url = null;
						String href = ResourceHelper.getUrl(selectedElement,
								methodElement, "html"); //$NON-NLS-1$
						if (linkType == LINK_ELEMENT_LINK_WITH_USER_TEXT) {
							String linkName = ((RichTextEditor) richText)
									.getSelected().getText();
							if (linkName.trim().length() == 0)
								linkName = selectedElement.getName();
							url = ResourceHelper
									.getElementLink(selectedElement, linkName,
											"file://" + href); //$NON-NLS-1$
						} else {
							boolean withType = (linkType == LINK_ELEMENT_LINK_WITH_TYPE) ? true
									: false;
							url = ResourceHelper
									.getElementLink(selectedElement, withType,
											"file://" + href); //$NON-NLS-1$
						}
						urlText.setText(url);
					}
				}
			}
		});
		browseButton.moveAbove(urlDisplayNameLabel);

		openLinkCheckbox = new Button(composite, SWT.CHECK);
		GridData checkBoxGridData = new GridData();
		checkBoxGridData.horizontalSpan = 2;
		openLinkCheckbox.setLayoutData(checkBoxGridData);
		openLinkCheckbox.setText(AuthoringUIResources.openLinkCheckbox_text);
		openLinkCheckbox.setSelection(true);
		openLinkCheckbox.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				openLinkInNewWindow = openLinkCheckbox.getSelection();
			}
		});

		urlDisplayNameText.setText(richText.getSelected().getText());

		return composite;
	}

	/**
	 * Returns the file to be copied to a resource folder.
	 */
	public File getFileToCopy() {
		return fileToCopy;
	}

	/**
	 * Returns <code>true</code> if the link should be opened in a new browser
	 * window.
	 */
	public boolean getOpenLinkInNewWindow() {
		return openLinkInNewWindow;
	}

	/**
	 * Called when the OK button is selected.
	 */
	protected void okPressed() {
		String url = urlText.getText();
		if (url != null && url.length() > 0) {
			if (linkType == LINK_URL) {
				String urlDisplayName = urlDisplayNameText.getText();
				if (urlDisplayName.trim().length() == 0) {
					urlDisplayName = url;
				}
				String fullURL = "<a href=\"" + //$NON-NLS-1$
						url
						+ "\"" + //$NON-NLS-1$
						(openLinkInNewWindow ? " " + OPEN_LINK_IN_NEW_WINDOW_ATTRIBUTE : "") + //$NON-NLS-1$ //$NON-NLS-2$
						">" + urlDisplayName + "</a>"; //$NON-NLS-1$ //$NON-NLS-2$
				link.setURL(fullURL);
			} else {
				link.setURL(url);
			}
		}

		// Set widget text to blank so super.okPressed doesn't overwrite the
		// above.
		urlText.removeModifyListener(modifyListener);
		urlText.setText(""); //$NON-NLS-1$
		super.okPressed();
	}

}
